首页 > 代码库 > Tarjan强联通分量【模板】
Tarjan强联通分量【模板】
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N(100015); 7 int n,m,v,u; 8 int edgesum,head[N]; 9 10 struct Edge11 {12 int from,to,next;13 Edge(int from=0,int to=0,int next=0) :14 from(from),to(to),next(next) {}15 }edge[N];16 int ins(int from,int to)17 {18 edge[++edgesum]=Edge(from,to,head[from]);19 return head[from]=edgesum;20 }21 22 int dfn[N],tim,low[N],vis[N];23 int Stack[N],top,instack[N];24 int col[N],colsum;25 26 void DFS(int now)27 {28 dfn[now]=low[now]=++tim; vis[now]=1;29 Stack[++top]=now; instack[now]=1;30 for(int i=head[now];i;i=edge[i].next)31 {32 int to=edge[i].to;33 if(instack[to]) low[i]=min(low[i],dfn[to]);34 else if(!vis[to])35 DFS(to),low[i]=min(low[i],low[to]);36 }37 if(low[now]==dfn[now])38 {39 colsum++;40 col[now]=colsum;41 for(;Stack[top]!=now;top--)42 {43 col[Stack[top]]=colsum;44 instack[Stack[top]]=0;45 }46 instack[now]=0;47 top--;48 }49 }50 51 int main()52 {53 scanf("%d%d",&n,&m);54 for(;m--;)55 {56 scanf("%d%d",&u,&v);57 ins(u,v);58 }59 for(int i=1;i<=n;i++)60 if(!vis[i]) DFS(i);61 return 0;62 }
Tarjan强联通分量【模板】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。