1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1005;
 4 int cnt,n,m;                        ///n为顶点数,m为边数,cnt为强连通分量的个数
 5 int low[N],dfn[N],num;
 6 int sccno[N];                       ///强连通分量编号
 7 vector<int > vec[N];
 8 stack<int > st;
 9 void dfs(int u)
10 {
11     st.push(u);
12     low[u]=dfn[u]=++num;
13     int len=vec[u].size();
14     for(int i=0;i<len;i++)
15     {
16         int v=vec[u][i];
17         if(!dfn[v]){
18             dfs(v);
19             low[u]=min(low[u],low[v]);
20         }
21         else if(!sccno[v])low[u]=min(low[u],dfn[v]);
22     }
23     if(low[u]==dfn[u]){
24         cnt++;
25         while(1)
26         {
27             int v=st.top();
28             st.pop();
29             sccno[v]=cnt;
30             if(v==u)break;
31         }
32     }
33 }
34 void tarjan()
35 {
36     cnt=num=0;
37     memset(sccno,0,sizeof(sccno));
38     memset(dfn,0,sizeof(dfn));
39     memset(low,0,sizeof(low));
40     for(int i=1;i<=n;i++)
41         if(!dfn[i])dfs(i);
42 }