tarjian強聯通分量(模板)
阿新 • • 發佈:2017-06-16
als 強連通 說明 聯通 class namespace 如果 return pac
來,水水模板吧。。。。。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 10000 using namespace std; int x,y,n,m,t,tot,sum,top,time; int head[N],col[N],stack[N],dfn[N],low[N],a[N][N]; bool vis[N]; struct Edge { intfrom,next,to; }edge[N]; int add(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=head[x]; head[x]=tot; } int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return f*x; } int tarjian(int now) { t=0; dfn[now]=low[now]=++time;//初始每一個點的low值dfn等於它的時間戳 stack[++top]=now; vis[now]=true;//將該點入棧,標記為在棧中 for(int i=head[now];i;i=edge[i].next)//更新於他相連的點的low值 { x=edge[i].to; if(vis[x]) low[i]=min(dfn[x],low[i]);//如果該點已經在棧中 else if(!dfn[x]) { tarjian(x); low[i]=min(low[x],low[i]);//從該點繼續拓展 } } if(low[now]==dfn[now])//說明以這個點結束強連通分量 { sum++;// 強連通分量的個數加一 col[now]=sum;//將該點放在她所屬的強連通分量了 for(;stack[top]!=now;top--) { col[stack[top]]=sum; vis[stack[top]]=false; } vis[now]=false; top--; } } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { x=read();y=read(); add(x,y); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjian(i); printf("%d",sum); return 0; }
tarjian強聯通分量(模板)