void dfs1(int x, int y, int p, bool LR){ for(int i=0; i<4; i++){ int tx = x+d[i][0], ty = y+d[i][1]; if(LR){ if(!mat[tx][ty]){ mat[tx][ty] = l++; dfs1(tx, ty, l-1, !LR); } }else{ if(mat[tx][ty] >= 0){ int tmp = mat[tx][ty]; if(!tmp) mat[tx][ty] = tmp = r++; e[p][tmp] = true; if(!L[p] && !R[tmp]) L[p] = tmp, R[tmp] = p; dfs1(tx, ty, l, !LR); } } } }
void dfs1(int x, int pre) { if (d[x] > m) return; if (v[m - d[x]] == now) checkmin(ans, c[m - d[x]] + e[x]); for (int k = h[x]; ~k; k = nxt[k]) if (mk[k] && p[k] != pre) { d[p[k]] = d[x] + w[k]; e[p[k]] = e[x] + 1; dfs1(p[k], x); } }
void dfs1(int src,int par){ eid[ein[src]=++ecnt]=src; sz[src]=1; hvy[src]=-1; for(int i:adj[src]){ if(i==par)continue; dfs1(i,src); sz[src]+=sz[i]; if(!~hvy[src]||sz[hvy[src]]<sz[i]) hvy[src]=i; } eout[src]=ecnt; }
vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) { vector<vector<int>> graph(N, vector<int>()); for (auto edge : edges) { graph[edge[0]].push_back(edge[1]); graph[edge[1]].push_back(edge[0]); } vector<int> sums(N), counts(N, 1); dfs1(0, -1, graph, sums, counts); dfs2(0, -1, graph, sums, counts); return sums; }
void dfs1(int x) { if(flag[x]) return ; else { flag[x]=1; int i; for(i=1;i<=n;i++) { if(b[x][i]&&flag[i]==0) dfs1(i); } } }
void init(int n) { for (int i = 0; i < N; i++) { g2[i].clear(); g3[i].clear(); } mem = 0; gentree(n); dfs1(getf(1), 0); dfs2(getf(1), getf(1)); segtree::init(mem); }
void kosarajuSCC() { memset(visited, false, sizeof visited); for(int i = 0; i < N; ++i) if(!visited[i]) dfs1(i); transposeGraph(); memset(visited, false, sizeof visited); while(!Stack.empty()) { int v = Stack.top(); Stack.pop(); if(!visited[v]) { dfs2(v); // printf("\n"); } } }
void korasaju() { for(int i=1;i<=n;i++) if(!apr[i]) {dfs1(i);} memset(apr,0,sizeof(apr)); for(int i=sn;i>=1;i--) if(!apr[stack[i]]) dfs2(stack[i],++connC); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(gMap[i][j] && mapNo[i]!=mapNo[j]) nMap[mapNo[i]][mapNo[j]]=true; }
void dfs1(int u, int f, int d) { fa[u] = f; son[u] = -1; deep[u] = d; t_size[u] = 1; for (int i = 0; i < (int)G[u].size(); i++) { int v = G[u][i]; if (v == f) continue; dfs1(v, u, d + 1); t_size[u] += t_size[v]; if (son[u] == -1 || t_size[v] > t_size[son[u]]) son[u] = v; } }
int solve() { int i, nblock = 0; pp = 1; memset(v, 0, sizeof(v)); memset(block, 0, sizeof(block)); for (i = 1; i <= n; i++) if (!v[i]) dfs1(i); for (i = n; i >= 1; i--) if (v[pos[i]]) { int ret = dfs2(pos[i], pos[i]); nblock++; if (!ret) return 0; } return 1; }
void dfs1(int u,int d){ dep[u] = d;sz[u] = 1;son[u] = -1; int mx = 0; for(int i = head[u];~i;i = nxt[i]){ Edge& ed = e[i]; if(ed.v==fa[u]) continue; fa[ed.v] = u; dfs1(ed.v,d+1); sz[u]+=sz[ed.v]; if(mx<sz[ed.v]){ son[u] = ed.v; mx = sz[ed.v]; } } }
int ok(int ii,int now) { int st=0,dig=now/three[8-ii]; for(int i=0; i<9; i++) st<<=1,st+=(now%3>0),now/=3; if(can[ii][st]>=0) return can[ii][st]; if(dig%3==0) return can[ii][st]=0; for(int i=0; i<9; i++) vis[i/3][i%3]=(st&(1<<i)); vis[ii/3][ii%3]=0; if(dfs1(ii/3,ii%3)) return can[ii][st]=1; return can[ii][st]=0; }
/* 強連結成分分解後の各頂点のトポロジカル順序を返す */ vector<int> solve() { used = new bool[V]; fill(used, used + V, false); vs.clear(); for (int v = 0; v < V; v++) { if (!used[v]) dfs1(v); } fill(used, used + V, false); int k = 0; vector<int> Ret(V, -1); for (int i = vs.size() - 1; i >= 0; i--) { if (!used[vs[i]]) dfs2(vs[i], k++, Ret); } delete[] used; return Ret; }
void scc(){ for(int x = 0; x < Vsize; x++){ if(!visited[x]) dfs1(x); } transpose(); for(int i = 0; i < Vsize; i++){ visited[i] = false; } while(!st.empty()){ int u = st.top(); st.pop(); if(!visited[u]) dfs2(u); std::cout << std::endl; } std::cout << std::endl; }
void dfs1(int x) { siz[x] = 1; son[x] = 0; for (int i = head[x]; i != -1; i = edge[i].next) { int &u = edge[i].to; if (u != fa[x]) { fa[u] = x; deep[u] = deep[x] + 1; dfs1(u); siz[x] += siz[u]; if (siz[son[x]] < siz[u]) son[x] = u; } } }
void dfs1(int root) { int son,i,size=map[root].size(); for(i=0;i<size;i++) { son=map[root][i]; dfs1(son); if(longest[son]+length[son] > longest[root]) { second[root]=longest[root]; longest[root]=longest[son]+length[son]; longid[root]=son; } else if(longest[son]+length[son] > second[root]) second[root]=longest[son]+length[son]; } }
int main(){ while(scanf("%d",&n),n){ sum=mx=0; for(ni=0;ni<n;ni++){ scanf("%d",&ar[ni]); sum+=ar[ni]; if(mx<ar[ni])mx=ar[ni]; } std::sort(ar,ar+n); for(j=mx;j*2<=sum;j++){ if(j==sum||(sum%j==0&&dfs1(j,0,n,n))){ printf("%d\n",j); break; } } } }
void work(int x) { v[0] = now = x + 1; for (int k = h[x]; ~k; k = nxt[k]) if (mk[k]) { d[p[k]] = w[k]; e[p[k]] = 1; dfs1(p[k], x); dfs2(p[k], x); } findroot(x, n); for (int k = h[x]; ~k; k = nxt[k]) if (mk[k]) { mk[k ^ 1] = false; f[n] = size = s[p[k]]; findroot(p[k], cur = n); work(cur); } }
void precut() { memset(visit,0,sizeof(visit)); memset(visite,0,sizeof(visite)); memset(bridge,0,sizeof(bridge)); memset(cut,0,sizeof(cut)); for(int i=0;i<n;i++) if (!visit[i]) { root=i; dfs1(i,-1,0); } memset(de,0,sizeof(de)); for(int i=0;i<cnt;i++) de[e[i].to]++; for(int i=0;i<n;i++) if (de[i]==1) cut[i]=1; }
void dfs1(int x, int Fa) { fa[x] = Fa; siz[x] = 1; dep[x] = dep[Fa] + 1; int max_size = 0; for (int i = lst[x]; i; i = nxt[i]) { int y = id[i]; if (y != Fa) { path[y] = i; //----------------- dfs1(y, x); if (siz[y] > max_size) { max_size = siz[y]; hvy[x] = y; } siz[x] += siz[y]; } } }
int dfs1(int n, int f) { dep[n] = dep[f]+1; fa[n] = f; int tot = 0; int tmp, p = 0, k = 0; if (g3[n].size() > 0) { for (int i = 0; i < g3[n].size(); i++) { tmp = dfs1(g3[n][i], n); if (tmp > k) { k = tmp; p = g3[n][i]; } tot += tmp; } } hson[n] = p; return siz[n] = tot+1; }
void dfs1(int u, int father, int d) { dep[u] = d; fa[u] = father; siz[u] = 1; for (int i = he[u]; ~i; i = next[i]) { int v = to[i]; if (v != father) { dfs1(v, u, d + 1); siz[u] += siz[v]; if (son[u] == -1 || siz[v] > siz[son[u]]) { son[u] = v; } } } }
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 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; }
void dfs1(int o,int fa) { tr[o].size=1;tr[o].len=0; int j=v[o]; long long tmp=0; while (j!=0) { if (e[j][0]!=fa) { int k=e[j][0]; dfs1(k,o); ans+=tmp*tr[k].len; tmp+=tr[k].len; tr[o].len+=tr[k].len; tr[o].len+=tr[o].size*tr[k].size; tr[o].size+=tr[k].size; } j=e[j][1]; } }
void init(){ scanf("%d%d%d", &n, &m, &k); for(int i=0; i<k; i++){ int ta, tb; scanf("%d%d", &ta, &tb); mat[tb][ta] = -1; } if( (n*m-k)%2 ) return ; for(int i=0; i<=n+1; i++) mat[i][0] = mat[i][m+1] = -1; for(int i=0; i<=m+1; i++) mat[0][i] = mat[n+1][i] = -1; l = r = 1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!mat[i][j]){ mat[i][j] = l++; dfs1(i, j, l-1, false); } }
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++])); }
void dfs1(int u,int fa,int time) { int num=0,first=0; id[u]=low[u]=++time; visit[u]=1; for(int p=box[u];p!=-1;p=e[p].next) { int v=e[p].to; if (v==fa) { first++; if (first==1) continue; } if (!visit[v]) { num++; dfs1(v,u,time); ckmin(low[u],low[v]); if (low[v]==id[v]&&u!=root) cut[u]=1; if (id[u]==low[v]&&u!=root) cut[u]=1; } else { ckmin(low[u],id[v]); } if (id[u]<low[v]) { bridge[p]=1; } } if (u!=root&&id[u]==low[u]) cut[u]=1; if (u==root&&num>1) cut[u]=1; }
void init(){ scanf("%d%d", &n, &m); memset(e, false, sizeof(e)); memset(mat, -1, sizeof(mat)); memset(L, -1, sizeof(L)); memset(R, -1, sizeof(R)); ttl = 0; for(int i=1; i<=n; i++){ getchar(); for(int j=1; j<=m; j++) if(getchar() == '*'){ mat[i][j] = 0; ttl++; } } l = r = 1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!mat[i][j]){ mat[i][j] = l++; dfs1(i, j, l-1, true); } }
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; }