POJ 3180 The cow Prom Tarjan基础题

题目用google翻译实在看不懂

其实题目意思如下

给一个有向图,求点个数大于1的强联通分量个数

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<stack>
 6 #define M 50010
 7 #define N 10010
 8 using namespace std;
 9 int n,m,u,v,head[N],cnt=1,ans,sz[N],belong[N],dfn[N],low[N],indx,tar;
10 bool inst[N];
11 stack <int> st;
12 struct edge
13 {
14     int u,v;
15 }e[M];
16 void add(int u,int v)
17 {
18     e[cnt].v=v;
19     e[cnt].u=head[u];
20     head[u]=cnt++;
21 }
22 void dfs(int u)
23 {
24     dfn[u]=low[u]=++indx;
25     inst[u]=1;
26     st.push(u);
27     for (int i=head[u];i;i=e[i].u)
28     {
29     int v=e[i].v;
30     if(!dfn[v])
31     {
32         dfs(v);
33         low[u]=min(low[u],low[v]);
34     }
35     else
36         if (inst[v])
37         low[u]=min(low[u],dfn[v]);
38     }
39     if (dfn[u]==low[u])
40     {
41     tar++;
42     while (1)
43     {
44         int t=st.top();
45         st.pop(),inst[t]=0;
46         sz[tar]++;
47         belong[t]=tar;
48         if (t==u)
49         break;
50     }
51     }}
52 int main()
53 {
54     scanf("%d%d",&n,&m);
55     for (int i=1;i<=m;i++)
56     {
57     scanf("%d%d",&u,&v);
58     add(u,v);
59     }
60     for (int i=1;i<=n;i++)
61     if (dfn[i]==0) dfs(i);
62     for (int i=1;i<=tar;i++)
63     ans+=sz[i]>1;
64     printf("%d",ans);
65     return 0;
66 }
原文地址:https://www.cnblogs.com/mrsheep/p/7840514.html