tarjan算法模版

 1 #include<iostream>
 2 #define num 5000
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int n,m;
 7 int f[num];
 8 
 9 
10 typedef struct{
11         int u,v,next;
12         }z;z edg[num];
13 int edgs=0,head[10000];
14 void Addedg(int a,int b){
15      edgs++;
16      edg[edgs].u=a;edg[edgs].v=b;
17      edg[edgs].next=head[a];
18      head[a]=edgs;
19      }
20 
21 void Init(){
22      cin>>n>>m;
23      for(int i=1;i<=n;++i)
24      f[i]=i;
25      
26      memset(head,-1,sizeof(head));
27      for(int i=1;i<=m;++i)
28      {
29        int a,b;
30        cin>>a>>b;
31        Addedg(i,b);
32              }
33      }
34 
35 bool mark[10000],vis[10000];
36 int cordnode[100000],top=-1,times=0;
37 int mintime[100000];
38 void Dfs(int k){
39      int now;
40      now=mintime[k]=times++;
41      vis[k]=1;
42      cordnode[++top]=k;
43      
44      for(int i=head[k];i!=-1;i=edg[i].next)
45      {
46        int v=edg[i].v;
47        if(mark[v]) continue;
48        if(!vis[v]) Dfs(v);
49        if(mintime[k]>mintime[v]) 
50        mintime[k]=mintime[v]; 
51              }
52      
53      if(mintime[k]==now)
54      {
55        while(cordnode[top]!=k)
56        {
57          f[cordnode[top]]=k;
58          mark[cordnode[top]]=1;
59          top--;               
60                               } 
61        f[cordnode[top]]=k;
62        top--; 
63                         }
64      
65      
66      }
67 
68 int main()
69 {
70     Init();
71     
72     for(int i=1;i<=n;++i)
73     if(!mark[i]) Dfs(i);
74     
75     int p[10000]={0};
76     
77     for(int i=1;i<=n;++i)
78     p[f[i]]=1;
79     int ans=0;
80     for(int i=1;i<=n;++i)
81     if(p[i]) ans++;
82     cout<<ans<<endl;
83     system("pause");
84     
85     } 
posted on 2012-10-17 19:48  怡红公子  阅读(221)  评论(0编辑  收藏  举报