POJ 2553 The Bottom of a Graph

Posted lipeiyi520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2553 The Bottom of a Graph相关的知识,希望对你有一定的参考价值。

题目传送门

题目中文大意:

对于一些点,任意一个点都互相可达,则这些点称为"汇".求每一个"汇"的所有点.

解题思路:

tarjan求强连通分量,缩点,对于所有没有出度的强连通分量的点,就是答案.

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<stack>
 4 #include<cstring>
 5 #include<vector>
 6 #include<algorithm>
 7 
 8 using namespace std;
 9 
10 int n,m,head[5001],tot,dfn[5001],low[5001],_tot,tt,belong[5001],outd[5001],ans[5001],k;
11 bool _in[5001];
12 struct kkk 
13     int to,next;
14 e[25000001];
15 stack<int> a;
16 
17 inline void chushihua() 
18     memset(head,-1,sizeof(head));
19     memset(belong,0,sizeof(belong));
20     memset(dfn,0,sizeof(dfn));
21     memset(low,0,sizeof(low));
22     memset(outd,0,sizeof(outd));
23     memset(ans,0,sizeof(ans));
24     tot = _tot = tt = k = 0;
25     memset(_in,0,sizeof(_in));
26 
27 
28 inline void add(int x,int y) 
29     e[++tot].next = head[x];
30     e[tot].to = y;
31     head[x] = tot;
32 
33 
34 inline void tarjan(int x) 
35     int v;
36     a.push(x);
37     dfn[x] = low[x] = ++_tot;
38     _in[x] = true;
39     for(int i = head[x];i != -1; i = e[i].next) 
40         v = e[i].to;
41         if(!dfn[v]) 
42             tarjan(v);
43             low[x] = min(low[x],low[v]);
44         
45         else 
46             if(_in[v])
47                 low[x] = min(low[x],dfn[v]);
48     
49     if(dfn[x] == low[x]) 
50         ++tt;
51         do 
52             v = a.top();
53             a.pop();
54             _in[v] = false;
55             belong[v] = tt;
56         
57         while(v != x);
58     
59 
60 
61 inline void _ans(int x) 
62     for(int i = 1;i <= n; i++)
63         if(belong[i] == x)
64             ans[++k] = i;
65 
66 
67 inline void _print() 
68     sort(ans+1,ans+k+1);
69     for(int i = 1;i <= k; i++)
70         printf("%d ",ans[i]);
71     printf("\n"); 
72 
73 
74 int main()
75 
76     while(true) 
77         chushihua();
78         scanf("%d",&n);
79         if(n == 0) return 0;
80         scanf("%d",&m);
81         for(int i = 1;i <= m; i++) 
82             int x,y;
83             scanf("%d%d",&x,&y);
84             add(x,y);
85         
86         for(int i = 1;i <= n; i++)
87             if(!dfn[i])
88                 tarjan(i);
89         for(int i = 1;i <= n; i++)
90             for(int j = head[i];j != -1; j = e[j].next) 
91                 if(belong[i] != belong[e[j].to])
92                     outd[belong[i]]++;
93         for(int i = 1;i <= tt; i++) 
94             if(outd[i] == 0)
95                 _ans(i);
96         _print();        
97     
98     return 0;
99 

 

以上是关于POJ 2553 The Bottom of a Graph的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2553 The Bottom of a Graph

POJ 2553 The Bottom of a Graph(强连通分量)

POJ2553 The Bottom of a Graph(强连通分量+缩点)

POJ 2553 The Bottom of a Graph

poj2553The Bottom of a Graph(强连通分量缩点)

The Bottom of a Graph