码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3180 The cow Prom Tarjan基础题

时间:2017-11-15 22:09:01      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:dfs   return   tor   r++   vector   poj   name   mes   google翻译   

题目用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 }

 

POJ 3180 The cow Prom Tarjan基础题

标签:dfs   return   tor   r++   vector   poj   name   mes   google翻译   

原文地址:http://www.cnblogs.com/mrsheep/p/7840514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!