tarjan缩点

整理了下模板。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('\n')
 9 using namespace std;
10 const int maxn=100000+10,maxm=500000+10;
11 int low[maxn],dfn[maxn],s[maxn],beg[maxn],top,scc,cz;bool ins[maxn];
12 struct ted{int x,y;ted*nxt;}adj[maxm],*fch[maxn],*ms=adj;
13 void add(int x,int y){*ms=(ted){x,y,fch[x]};fch[x]=ms++;return;}
14 void tarjan(int u){
15     low[u]=dfn[u]=++cz;ins[u]=true;s[++top]=u;
16     for(ted*e=fch[u];e;e=e->nxt){
17         int v=e->y;if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
18         else if(ins[v])low[u]=min(low[u],dfn[v]);
19     }if(low[u]==dfn[u]){
20         scc++;int t=-1;while(t!=u)beg[t=s[top--]]=scc,ins[t]=false;
21     }return;
22 }
23 inline int read(){
24     int x=0,sig=1;char ch=getchar();
25     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
26     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
27     return x*=sig;
28 }
29 inline void write(int x){
30     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
31     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
32     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
33 }
34 int n,m;
35 void init(){
36     n=read();m=read();int x,y;
37     while(m--){x=read();y=read();add(x,y);}
38     for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
39     for(int i=1;i<=n;i++){
40         printf("%d:%d\n",i,beg[i]);
41     }
42     return;
43 }
44 void work(){
45     return;
46 }
47 void print(){
48     return;
49 }
50 int main(){init();work();print();return 0;}
51 /*
52 5 5
53 1 2
54 2 3
55 3 4
56 4 5
57 5 1
58 */

 

posted @ 2015-07-19 08:51  AI_Believer  阅读(325)  评论(0编辑  收藏  举报