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 }