Exemplo n.º 1
0
int main()
{
    tot=0;
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        int x,y;scanf("%d%d",&x,&y);
        e[++tot][0]=y;
        e[tot][1]=v[x];
        v[x]=tot;
        e[++tot][0]=x;
        e[tot][1]=v[y];
        v[y]=tot;
    }
    dfs1(1,0);
    dfs2(1,0);ans+=ans;
    printf("%I64d\n",ans);
    return 0;
}
int main()
{
    int i,fa,len;
    while(scanf("%d",&n)!=EOF)
    {
        chu();
        for(i=2;i<=n;i++)
        {
            scanf("%d%d",&fa,&len);
            map[fa].push_back(i);
            length[i]=len;
        }
        dfs1(1);
        dfs2(1);
        for(i=1;i<=n;i++)
            printf("%d\n",max(longest[i],shang[i]));
    }
    return 0;
}
Exemplo n.º 3
0
int dfs2(int x, int pre, int *d) {
        int ret = 0, tmp;
        if(special[x]) stk[stk_top++] = x;
        if(black[x]) {
                point[stk[stk_top-1]].push_back(x);
        }
        for(Edge*p = head[x]; p; p = p->nxt) if(p->e != pre){
                d[p->e] = p->c + d[x];
                tmp = dfs2(p->e, x, d);
                if(!special[p->e]) ret += tmp;
        }
        if(special[x]) --stk_top;

        if(!special[x] && !black[x]) {
                if(ret > res) res = ret, resCnt = 1;
                else if(ret == res) ++resCnt;
        }
        return ret + black[x];
}
Exemplo n.º 4
0
void dfs2(vector<int> &nums, int gap, int start)
{
    if (gap == 0)
    {   // 找到一个合法解
        result.push_back(intermediate);
        return;
    }
    int previous = -1;
    for (size_t i = start; i < nums.size(); i++)
    {
        if (previous == nums[i]) //从一层内搜索,因为原集合允许相同数字,相同数字会引起重复结果出现,之前已将集合排序,使用pre来避免重复是合适的
            continue;
        if (gap < nums[i])
            return;  // 剪枝

        previous = nums[i];//记录这一层选择的数

        intermediate.push_back(nums[i]);
        dfs2(nums, gap - nums[i], i + 1);//不再重复使用当前点
        intermediate.pop_back(); // 恢复环境
    }
}
Exemplo n.º 5
0
int main() {
	int n; scanf("%d", &n);

	for (int i = 0; i < n; i++)
		vs[i].i = i, vs[i].a = NULL;

	for (int i = 0; i < n-1; i++) {
		int ui, vi; scanf("%d%d", &ui, &vi); ui--; vi--;
		vertex *u = &vs[ui], *v = &vs[vi];

		es[2*i] = (edge){v, u->a}; u->a = &es[2*i];
		es[2*i+1] = (edge){u, v->a}; v->a = &es[2*i+1];
	}

	dfs(&vs[0], NULL);

	dfs2(&vs[0], NULL, 0, 0);

	printf("%lld\n", a);

	return 0;
}
int main(){
    scanf("%d%d%d",&N,&M,&R);
    for(int i=1,a,b;i<N;++i){
        scanf("%d%d",&a,&b);
        adj[a].emplace_back(b);
        adj[b].emplace_back(a);
    }
    for(int i=1;i<=N;++i){
        scanf("%d",col+i);
        vals[i-1]=col[i];
    }
    std::sort(vals,vals+N);
    valcnt=std::unique(vals,vals+N)-vals;
    for(int i=1;i<=N;++i)
        col[i]=std::lower_bound(vals,vals+valcnt,col[i])-vals;
    for(int i=0,a;i<M;++i){
        scanf("%d",&a);
        qrys[a].emplace_back(i);
    }
    dfs1(R,-1);
    dfs2(R,-1);
    for(int i=0;i<M;printf("%d\n",ans[i++]));
}
Exemplo n.º 7
0
int main() {
	freopen("kak-u-pakal.in","r",stdin);
	freopen("kak-u-pakal.out","w",stdout);
	gets(s);
	maxpw = maxph = 1;
	dfs(0, strlen(s)-1, 0, 1, 0, 1);
	w = maxw;
	if (w % maxpw) w = w/maxpw*maxpw+maxpw;
	h = maxh;
	if (h % maxph) h = h/maxph*maxph+maxph;
	ans = new char*[h+1];
	for (int i = 0; i <= h; i++) {
		ans[i] = new char[w+1];
		memset(ans[i], 32, w+1);
	}
	dfs2(0, 0, h, w, 0, strlen(s)-1);
	for (int i = 0; i <= h; i++) {
		for (int j = 0; j <= w; j++)
			putchar(ans[i][j]);
		puts("");
	}
	return 0;
}
Exemplo n.º 8
0
void init()
{
	int k;
	scanf("%d",&n);
	while((1<<k)<=n) ++k;
	totn=1<<k;
	for(int i=totn+1;i<=(totn<<1);++i) maxv[i]=-INF,sumv[i]=0;
	root=1;
	fa[root]=-1;
	dep[root]=0;
	for(int i=0;i<n-1;++i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	for(int i=1;i<=n;++i) scanf("%d",val+i);
	dfs(root);
	dfs2(root,root);
	for(int i=1;i<=n;++i)
		update(1,1,totn,w[i],val[i]);
}
Exemplo n.º 9
0
int main()
{
	int Qs,lim;
	scanf("%d%d%d",&n,&Qs,&lim);
	for(int i=1;i<=n;i++){
		scanf("%d",&ag[i].sc);
		ag[i].id=i;
	}
	std::sort(ag+1,ag+1+n);
	for(int i=1,p1,p2,dis;i<=n-1;i++)
	{
		scanf("%d%d%d",&p1,&p2,&dis);
		addEdge(p1,p2,dis);
		addEdge(p2,p1,dis);
	}
	distort[1]=0;esum[0]=0;
	dfs(1);
	dfs2(1,1);
	for(int i=1;i<=n;i++) esum[i]+=esum[i-1];
	for(int i=1;i<=n;i++) sumdis[i]=sumdis[i-1]+distort[ag[i].id];
	for(int i=1,p;i<=n;i++)
	{
		p=ag[i].id; rot[i]=rot[i-1];
		while(top[p]!=1){rot[i]=update(rot[i],dfo[top[p]],dfo[p],1,n);p=fa[top[p]];}
		rot[i]=update(rot[i],1,dfo[p],1,n);
	}
	long long preans=0;
	for(int i=1,mise,ra,rb,ll,rr;i<=Qs;i++)
	{
		scanf("%d%d%d",&mise,&ra,&rb);
		ll=Min((preans+ra)%lim,(preans+rb)%lim);
		rr=Max((preans+ra)%lim,(preans+rb)%lim);
		ll=findbound(ll);
		rr=findupper(rr);
		printf("%lld\n",(preans=(sumdis[rr]-sumdis[ll-1])+distort[mise]*(rr-ll+1)-(query(rot[rr],mise)-query(rot[ll-1],mise))*2));
	}
}
void dfs2(int here){
    discovered[here] = counter++;
    for(int i = 0; i < adj[here].size(); i++){
        int there = adj[here][i];
        cout << "(" << here "," << there << ") is a ";
        // 아직 방문한 적 없다면 방문한다.
        if(discovered[there] == -1){
            cout << "tree edge" << endl;
            dfs2(there);
        }
        // 방문한 적 있다면,
        
        // 만약 there가 here보다 늦게 발견됐으면 there는 here의 후손이다
        else if(discovered[here] < discovered[there])
            cout << "forward edge" << endl;
        // 만약 dfs2(there)가 아직 종료하지 않았으면 there는 here의 선조다.
        else if(finished[there] == 0)
            cout << "back edge" << endl;
        // 이 외의 경우는 모두 교차 간선.
        else
            cout << "cross edge" << endl;
    }
    finished[here] = 1;
}
Exemplo n.º 11
0
int main() {
	freopen("t.in", "r", stdin);
	scanf("%d%d", &N, &M);
	while ( M -- ) {
		int a, b;
		scanf("%d%d", &a, &b);
		a --,  b --;
		ed[a][b] = true;
	}
	for ( int i = 0; i < N; i ++ ) {
		memset(vis, 0, sizeof(bool) * N);
		dfs2(i);
		for ( int j = 0; j < N; j ++ )
			if ( j != i && vis[j] ) 
				ed2[i][j] = true;
	}
	memset(match, -1, sizeof(int) * N);
	int ans = 0;
	for ( int i = 0; i < N; i ++ ) {
		memset(vis, 0, sizeof(bool) * N);
		ans += dfs(i);
	}
	printf("%d\n", N - ans);
}
Exemplo n.º 12
0
int main(void)
{
    while(scanf("%d %d",&n,&m)!=EOF&&!(n==0&&m==0))
    {
       int i;
       for(i=0;i<n;i++)
         tail[i]=-1,tail2[i]=-1,use[i]=0;
       for(i=0;i<m;i++)
       {
          int a,b;
          scanf("%d %d",&a,&b);
          edge_to[i]=b;
          edge_next[i]=tail[a];
          tail[a]=i;
          
          edge_to2[i]=a;
          edge_next2[i]=tail2[b];
          tail2[b]=i;
       }
       x=0;
       for(i=0;i<n;i++)
         if(use[i]==0)
           dfs1(i);
       for(i=0;i<n;i++)
         use[i]=0;
       g=0;
       for(i=x-1;i>=0;i--)
         if(use[tp[i]]==0)
         {
           g++;
           dfs2(tp[i]);
         }
       printf("%d\n",g);
    }
    return 0;
} 
Exemplo n.º 13
0
void dfs2(int x) {
	vis[x] = true;
	for ( int y = 0; y < N; y ++ )
		if ( ed[x][y] && !vis[y] )
			dfs2(y);
}
Exemplo n.º 14
0
    void getsg() {
	dfs1(0);
	dfs2(0);
    }
Exemplo n.º 15
0
vector<vector<int> > combinationSum(vector<int> &nums, int target)
{
    sort(nums.begin(), nums.end());
    dfs2(nums, target, 0);
    return result;
}
Exemplo n.º 16
0
TreeNode* Solution::Deserialize(char *str)
{
    int *p = (int*)str;
    return dfs2(p);
}
Exemplo n.º 17
0
void dfs2(int from) {
    gccid[from] = id;
    gcc[id].pb(from);
    for (int to: g2[from]) if (gccid[to] == -1) dfs2(to);
}
Exemplo n.º 18
0
inline void do_dp2()
{
	dfs2(1, 0);
}
Exemplo n.º 19
0
void init(int root) {
    dfs1(root, -1, 0);
    pos_clk = 0;
    dfs2(root, root);
}
Exemplo n.º 20
0
int main()
{
    int i,a,b,index,n,m,x,y;
    while (~scanf("%d%d",&n,&m))
    {
        tCount=0;
        bCount=0;
        tol1=0;
        tol2=0;
        for(i=0;i<=n;i++)
        {
            head1[i]=-1;
            head2[i]=-1;
            visit1[i]=0;
            visit2[i]=0;
        }
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
        }
        for(i=1;i<=n;i++)
            if(visit1[i]==0)
                dfs1(i);
        for(i=tCount-1;i>=0;i--)
        {
            if(visit2[t[i]]==0)
            {
                count=0;
                dfs2(t[i]);
                val[bCount]=count;
                bCount++;
            }
        }
        for(i=0;i<bCount;i++)
        {
            in[i]=0;
            head[i]=-1;
        }
        for(i=0;i<tol1;i++)
        {
            x=belong[edge1[i].from];
            y=belong[edge1[i].to];
            if(x!=y)
            {
                in[x]++;
                add1(y,x);
            }
        }
        index=0;
        for(i=0;i<bCount;i++)
        {
            if(in[i]==0)
            {
                memset(visit,0,sizeof(visit));
                count=0;
                dfs(i);
                if(count==bCount)
                {
                    index+=val[i];
                }
            }
        }
        printf("%d\n",index);
    }
    return 0;
}
Exemplo n.º 21
0
int main() {
        int n, m;
        scanf("%d%d", &n, &m);
        for(int i = 0; i < m; ++i) {
                scanf("%d", an + i); 
                black[--an[i]] = 1;
        }
        for(int i = 0, s, t, c; i < n-1; ++i) {
                scanf("%d%d%d", &s, &t, &c);
                --s; --t;
                adde(s, t, c); adde(t, s, c);
        }

        dis[an[0]] = 0;
        dfs(an[0], -1);
        S = an[0];
        for(int i = 0; i < m; ++i) if(dis[S] < dis[an[i]]) S = an[i];
        dis[S] = 0;
        dfs(S, -1);
        T = S;
        for(int i = 0; i < m; ++i) if(dis[T] < dis[an[i]]) T = an[i];
        dia_top = 0;
        for(int i = T; ~i; i = fa[i]) {
                special[i] = 1;
                diameter[dia_top++] = i;
        }
        dis2[T] = 0;
        stk_top = 0;
        res = 0, resCnt = 0;
        dfs2(T, -1, dis2);

        int cnt = 0;
        for(int i = 0, idx; i < dia_top; ++i) {
                idx = diameter[i];
                ans[idx] += cnt;
                snuke(it, point[idx]) {
                        if(dis2[*it] < dis[*it]) {
                                ++cnt;
                        }
                        if(dis2[*it] == dis2[S]) {
                                cnt = 0; break;
                        }
                }
        }

        cnt = 0;
        for(int i = dia_top-1, idx; i >= 0; --i) {
                idx = diameter[i];
                ans[idx] += cnt;
                snuke(it, point[idx]) {
                        if(dis2[*it] > dis[*it]) {
                                ++cnt;
                        }
                        if(dis[*it] == dis[T]) {
                                cnt = 0; break;
                        }
                }
                
        }

        for(int i = 0, idx; i < dia_top; ++i) {
                idx = diameter[i];
                if(black[idx]) continue;
                ans[idx] += point[idx].size();
                if(res < ans[idx]) res = ans[idx], resCnt = 1;
                else if(res == ans[idx]) ++resCnt;
        }
        if(!res) printf("%d %d\n", 0, n - m);
        else printf("%d %d\n", res, resCnt);
        return 0;
}