拓扑排序

拓扑排序就是每次选择一个入度为0的点,然后删去该点及该点所连的边。

 

拓扑排序单独出题挺少的,主要是用来优化其他算法。

 

 

拓扑排序模版:

 1 #include <math.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <string>
 7 #include <string.h>
 8 #include <vector>
 9 #include <map>
10 #include <stack>
11 #include <set>
12 #include <queue>
13 
14 
15 #define LL long long
16 #define INF 0x3f3f3f3f
17 #define ls nod<<1
18 #define rs (nod<<1)+1
19 
20 const int maxn = 2e5 + 10;
21 
22 int n,m,u,v;
23 
24 int InDeg[maxn];
25 std::vector<int> vec[maxn];
26 
27 bool topsort() {
28     std::queue<int> q;
29     int num = 0;
30     for (int i=1;i<=n;i++) {
31         if (!InDeg[i])
32             q.push(i);
33     }
34     while (!q.empty()) {
35         int now = q.front();
36         q.pop();
37         num++;
38         for (int i=0;i<vec[now].size();i++) {
39             if (--InDeg[vec[now][i]] == 0)
40                 q.push(vec[now][i]);
41         }
42     }
43     if (num == n)
44         return true;
45     return false;
46 }
47 
48 int main() {
49     int T;
50     scanf("%d",&T);
51     while (T--) {
52         scanf("%d%d",&n,&m);
53         for (int i=1;i<=n;i++) {
54             vec[i].clear();
55         }
56         memset(InDeg,0, sizeof(InDeg));
57         while (m--) {
58             scanf("%d%d",&u,&v);
59             vec[u].push_back(v);
60             InDeg[v]++;
61         }
62         if (topsort())
63             printf("Correct\n");
64         else
65             printf("Wrong\n");
66     }
67     return 0;
68 }

 

posted @ 2019-12-03 20:06  _Ackerman  阅读(241)  评论(0编辑  收藏  举报