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; }
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]; }
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(); // 恢复环境 } }
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++])); }
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; }
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]); }
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; }
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); }
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; }
void dfs2(int x) { vis[x] = true; for ( int y = 0; y < N; y ++ ) if ( ed[x][y] && !vis[y] ) dfs2(y); }
void getsg() { dfs1(0); dfs2(0); }
vector<vector<int> > combinationSum(vector<int> &nums, int target) { sort(nums.begin(), nums.end()); dfs2(nums, target, 0); return result; }
TreeNode* Solution::Deserialize(char *str) { int *p = (int*)str; return dfs2(p); }
void dfs2(int from) { gccid[from] = id; gcc[id].pb(from); for (int to: g2[from]) if (gccid[to] == -1) dfs2(to); }
inline void do_dp2() { dfs2(1, 0); }
void init(int root) { dfs1(root, -1, 0); pos_clk = 0; dfs2(root, root); }
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; }
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; }