1. 程式人生 > >tarjian強聯通分量(模板)

tarjian強聯通分量(模板)

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
{
    int
from,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強聯通分量(模板)