P1347 排序(拓扑排序)

题目传送门:https://www.luogu.com.cn/problem/P1347

拓扑排序模板题,第一种情况是求这张图拓扑排序之后是否为n个点,也就是说,这张图必须无环,而且有且仅有一个点的入度为0,第二种情况是求图中是否存在环,第三种情况就是如果在m次建边之后无法得到前两种情况直接输出就可以了。由于数据规模极小,可以一边建边一边拓扑排序。

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<map>
  6 #include<queue>
  7 #include<set>
  8 #include<cmath>
  9 #include<list>
 10 #include<cstring>
 11 #include<string>
 12 #define ll long long
 13 #define ull unsigned long long
 14 #define inf 0x3f3f3f3f
 15 #define inff 0x7fffffff
 16 using namespace std;
 17 const int N = 100000 + 10;
 18 
 19 struct node {
 20     int to, w, next;
 21 }e[N << 2];
 22 int head[N << 2];
 23 int tot;
 24 
 25 void add(int u, int v) {
 26     e[tot].to = v;
 27     e[tot].next = head[u];
 28     head[u] = tot++;
 29 }
 30 
 31 vector<int>topo;
 32 int c[N], n, m;
 33 
 34 bool dfs(int u) {
 35     c[u] = -1;
 36     for (int i = head[u]; i + 1; i = e[i].next) {
 37         int v = e[i].to;
 38         if (c[v] < 0)
 39             return false;
 40         else if (!c[v])
 41             if (!dfs(v)) return false;
 42     }
 43     c[u] = 1;
 44     topo.push_back(u);
 45     return true;
 46 }
 47 
 48 int cnt = 0;
 49 int toposort() {
 50     cnt = 0;
 51     topo.clear();
 52     memset(c, 0, sizeof(c));
 53     for (int u = 1; u <= n; u++) {
 54         if (!c[u]) {
 55             if (!dfs(u)) {
 56                 return 0;
 57             }
 58             else {
 59                 cnt++;
 60             }
 61         }
 62     }
 63     reverse(topo.begin(), topo.end());
 64     if (cnt > 1) return 2;
 65     if (cnt == 1) return 1;
 66 
 67 }
 68 
 69 map<int, map<int, int>>mp;
 70 
 71 int main() {
 72 
 73     cin >> n >> m;
 74     memset(head, -1, sizeof(head));
 75     for (int i = 1; i <= m; i++) {
 76         string s;
 77         cin >> s;
 78         if (s[1] == '<') {
 79             if (!mp[s[0] - 'A' + 1][s[2] - 'A' + 1]) {
 80                 add(s[0] - 'A' + 1, s[2] - 'A' + 1);
 81                 mp[s[0] - 'A' + 1][s[2] - 'A' + 1] = 1;
 82             }
 83         }
 84         else {
 85             if (!mp[s[2] - 'A' + 1][s[0] - 'A' + 1]) {
 86                 add(s[2] - 'A' + 1, s[0] - 'A' + 1);
 87                 mp[s[2] - 'A' + 1][s[0] - 'A' + 1] = 1;
 88             }
 89         }
 90         int op = toposort();
 91         if (op == 1) {
 92             //cout << i << "a\n";
 93             cout << "Sorted sequence determined after " << i << " relations: ";
 94             for (int i = 0; i < topo.size(); i++) {
 95                 cout << char(topo[i] - 1 + 'A');
 96             }
 97             cout << ".\n";
 98             return 0;
 99         }
100         else if (op == 0) {
101             //cout << i << "b\n";
102             cout << "Inconsistency found after " << i << " relations." << "\n";
103             return 0;
104         }
105         else {
106             //cout << i << "c\n";
107             continue;
108         }
109     }
110     cout << "Sorted sequence cannot be determined.\n";
111 
112     return 0;
113 }

 

 
 
posted @ 2022-08-05 16:36  Keyzee  阅读(29)  评论(0编辑  收藏  举报