hdoj-3342-Legal or Not(拓扑排序)

题目链接

 1 /*
 2     Name:hdoj-3342-Legal or Not
 3     Copyright:
 4     Author:
 5     Date: 2018/4/11 15:59:18
 6     Description:
 7         判断是否存在环 
 8 */
 9 #include <iostream>
10 #include <queue>
11 #include <vector>
12 #include <cstring>
13 #include <algorithm>
14 using namespace std;
15 const int MAXN = 1e+5;
16 int du[MAXN], n , m, L[MAXN];
17 vector<int>  g[MAXN];
18 bool topsort() {
19     memset(du, 0, sizeof(du));
20     for (int i=0; i<n; i++) {
21         for (int j=0; j<g[i].size(); j++) {
22             du[g[i][j]]++; 
23         }
24     }
25     int tot = 0;
26     queue<int> Q;
27     for (int i=0; i<n; i++) {
28         if (!du[i]) {
29             Q.push(i);
30         }
31     }
32     while (!Q.empty()) {
33         int x = Q.front();
34         Q.pop();
35         L[tot++] = x;
36         for (int j=0; j<g[x].size(); j++) {
37             int t = g[x][j];
38             du[t]--;
39             if (!du[t]) {
40                 Q.push(t);
41             }
42         } 
43     }
44     if (tot == n) return 1;
45     return 0;
46 } 
47 int main()
48 {
49     while (cin>>n>>m && (m || n)) {
50         memset(L, 0, sizeof(L));
51         memset(g, 0, sizeof(g));
52         for (int i=0; i<m; i++) {
53             int a, b;
54             cin>>a>>b;
55             g[a].push_back(b);
56         }
57         if (topsort() == 1) cout<<"YES"<<endl;
58         else cout<<"NO"<<endl;
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/slothrbk/p/8796736.html