我的使用,可能不是很詳細spa
這裏的dfn能夠寫成lowcode
由於都是在棧中,只要保證該節點的low值不爲自己便可class
void tarjan(int now) { dfn[now]=low[now]=++tot; s.push(now); vis[now]=1; for(int i=headE[now];i!=-1;i=E[i].nxt) { if(!dfn[E[i].v]) tarjan(E[i].v),low[now]=min(low[now],low[E[i].v]); else if(vis[E[i].v]) low[now]=min(low[now],dfn[E[i].v]); } if(low[now]==dfn[now]) { int h; colornum++; do { h=s.top(); color[h]=colornum; sum[colornum]+=money[h]; vis[h]=0; s.pop(); }while(h!=now); } }
條件\(low[j]>=dfn[i]\)top
棧的邊界條件須要特殊判斷poi
void tarjan(int now,int fa) { dfn[now]=low[now]=++tot; s.push(now); for(int i=head[now];i!=-1;i=edge[i].nxt) { if(!dfn[edge[i].v]&&edge[i].v!=fa) { tarjan(edge[i].v,now); low[now]=min(low[now],low[edge[i].v]); if(low[edge[i].v]>=dfn[now]) { memset(in,0,sizeof(in));//哪些在雙聯通份量裏 memset(color,0,sizeof(color)); int h=0,cnt=0; do { h=s.top();s.pop(); in[h]=1; point[++cnt]=h; }while(h!=edge[i].v);//warning if(cnt<=1) continue;//必須構成環 in[now]=1;point[++cnt]=now; if(MakeColor(now,1)==0) for(int j=1;j<=cnt;j++) ans[point[j]]=1; } } if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]); } }
記錄一下父親節點就好vi
void tarjan(int now,int fa) { dfn[now]=low[now]=++tot; s.push(now); vis[now]=1; for(int i=head[now];i!=-1;i=edge[i].nxt) { if(!dfn[edge[i].v]&&edge[i].v!=fa) tarjan(edge[i].v,now),low[now]=min(low[now],low[edge[i].v]); if(vis[edge[i].v]&&edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]); } if(dfn[now]==low[now]) { int h=0; colornum++; do { h=s.top(); color[h]=colornum; s.pop(); }while(h!=now); } }
條件\(low[j]>=dfn[i]\)while
int tarjan(int now,int fa) { int ch=0; dfn[now]=low[now]=++tot; for(int i=head[now];i!=-1;i=edge[i].nxt) { if(!dfn[edge[i].v]) { tarjan(edge[i].v,fa); low[now]=min(low[now],low[edge[i].v]); if(low[edge[i].v]>=dfn[now]&&now!=fa) cut[now]=1; if(now==fa) ch++; } low[now]=min(low[now],dfn[edge[i].v]); } if(now==fa&&ch>=2) cut[now]=1; }
條件\(low[v]>dfn[now]\)co
void tarjan(int now,int fa) { dfn[now]=low[now]=++tot; for(int i=head[now];i!=-1;i=edge[i].nxt) { if(!dfn[edge[i].v]) { deep[edge[i].v]=deep[now]+1; f[edge[i].v]=now; tarjan(edge[i].v,now); low[now]=min(low[now],low[edge[i].v]); if(low[edge[i].v]>dfn[now]) { bridge[edge[i].v]=1; ans++; } } else if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]); } }