[模板]一些tarjan
发现自己菜的一匹,于是发奋图强开始填坑(
可以参考老姚博客 这里
1. tarjan板子
void tarjan(int u){ ipt[u]=low[u]=++cnt; s.push(u),instk[u]=true; for(int i=head[u];i;i=edge[i].pre){ int v=edge[i].to; if(!ipt[v]){ tarjan(v); low[u]=min(low[u],low[v]); }else if(instk[v]){ low[u]=min(low[u],ipt[v]); } } if(ipt[u]==low[u]){ point++; int v; do{ v=s.top(),s.pop(); instk[v]=false; sze[point]++; id[v]=point; }while(u!=v); } }
2. 求割点
void tarjan(int root,int u){ int son=0; ipt[u]=++tot;low[u]=tot; s.push(u);instk[u]=true; for(int i=head[u];i;i=edge[i].pre){ int v=edge[i].to; if(!ipt[v]){ tarjan(u,v); low[u]=min(low[u],low[v]); if(((!root)&&(++son>1))||((root)&&low[v]>=ipt[u])){ cutpt[u]=1; }//求割点 }else if(instk[v]){ low[u]=min(low[u],ipt[v]); } } }
3. 求割边
void tarjan(int u){ //printf("Now is visiting node %d\n",u); ipt[u]=++tot,low[u]=tot; for(int i=head[u];i;i=edge[i].pre){ int v=edge[i].to; if(!ipt[v]){ fa_edge[v]=edge[i].id; tarjan(v); low[u]=min(low[u],low[v]); }else if(fa_edge[u]!=edge[i].id){ low[u]=min(low[u],ipt[v]); } } if(low[u]==ipt[u]&&fa_edge[u]){ cutedge[fa_edge[u]]=true; } }
本文来自博客园,作者:冬天的雨WR,转载请注明原文链接:https://www.cnblogs.com/WintersRain/p/16460153.html
为了一切不改变的理想,为了改变不理想的一切