拓扑序列 之 hdu 5154 Harry and Magical Computer
/*
AOV网(Activity On Vertex Network):
用图来表示工程:其中,用顶点表示活动;弧表示活动之间的制约关系。
工程是否顺利进行?---->AOV网是否存在有向回路
*******************************************
用产生(包含所有) 顶点序列的方法,顶点序列满足:
在图中,若顶点vi到顶点vj存在路径,
则在序列中,顶点vi领先于顶点vj。
满足上述条件的顶点序列称为拓扑序列,
产生这一序列的过程称为拓扑排序。
*******************************************
AOV网是否含有有向回路 <----> 是否可以产生拓扑序列
注意:
此题测试数据中,对于重边,保存一条即可;对于自环也需要输出"NO"。
*/
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include <algorithm> 7 #include <string> 8 #include <locale> 9 #include <cmath> 10 #include <vector> 11 #include <cstring> 12 #include <map> 13 #include <utility> 14 #include <queue> 15 #include <stack> 16 #include <set> 17 #include <functional> 18 using namespace std; 19 typedef pair<int, int> PII; 20 typedef long long int64; 21 const int INF = 0x3f3f3f3f; 22 const int modPrime = 3046721; 23 const double eps = 1e-9; 24 const int MaxN = 110; 25 const int MaxM = 10010; 26 27 int n, m; 28 bool G[MaxN][MaxN]; 29 int ndCnt[MaxN]; 30 31 32 void Solve() 33 { 34 int cnt = 0; 35 stack<int> stk; 36 for (int i = 0; i < n; ++i) 37 { 38 if (0 == ndCnt[i]) 39 { 40 stk.push(i); 41 } 42 } 43 while (!stk.empty()) 44 { 45 int node = stk.top(); 46 stk.pop(); 47 ++cnt; 48 for (int i = 0; i < n; ++i) 49 { 50 if (G[node][i]) 51 { 52 --ndCnt[i]; 53 if (0 == ndCnt[i]) 54 { 55 stk.push(i); 56 } 57 } 58 } 59 } 60 if (cnt == n) 61 { 62 printf("YES\n"); 63 } 64 else 65 { 66 printf("NO\n"); 67 } 68 } 69 70 int main() 71 { 72 #ifdef HOME 73 freopen("in", "r", stdin); 74 //freopen("out", "w", stdout); 75 #endif 76 while (~scanf("%d %d", &n, &m)) 77 { 78 for (int i = 0; i < n; ++i) 79 { 80 ndCnt[i] = 0; 81 for (int j = 0; j < n; ++j) 82 { 83 G[i][j] = false; 84 } 85 } 86 87 int a, b; 88 for (int i = 0; i < m; ++i) 89 { 90 scanf("%d %d", &a, &b); 91 // 对于重边的处理办法 92 if (!G[b - 1][a - 1]) 93 { 94 G[b - 1][a - 1] = true; 95 ++ndCnt[a - 1]; 96 } 97 } 98 Solve(); 99 } 100 101 #ifdef HOME 102 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 103 _CrtDumpMemoryLeaks(); 104 #endif 105 return 0; 106 }