1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <bits/stdc++.h> using namespace std; const int LEN = 26; int n, m, tot, cnt, len, head[LEN], ind[LEN], tind[LEN], val[LEN]; string ans; queue<int> q;
struct edge { int to_, nxt_; } e[(int)600 + 50];
void add(int u, int v) { e[tot].nxt_ = head[u], e[tot].to_ = v; head[u] = tot++; }
bool toposort() { for (int i = 0; i < n; ++i) { if (~head[i] && !tind[i]) { q.emplace(i); val[i] = 1; } } while (!q.empty()) { int u = q.front(); q.pop(); ans += (char)(u + 'A'); ++cnt; for (int i = head[u]; ~i; i = e[i].nxt_) { int v = e[i].to_; val[v] = max(val[v], val[u] + 1); if (--tind[v] == 0) q.emplace(v); } } for (int i = 0; i < n; ++i) len = max(len, val[i]); for (int i = 0; i < n; ++i) if (tind[i]) return false; return true; }
int main() { memset(head, -1, sizeof(head)); string in; int u, v; cin >> n >> m; for (int i = 1; i <= m; ++i) { len = cnt = 0, ans = ""; memset(val, 0, sizeof(val)); cin >> in, u = in[0] - 'A', v = in[2] - 'A'; add(u, v), ++ind[v]; copy(ind, ind + LEN, tind); if (!toposort()) { cout << "Inconsistency found after " << i << " relations."; return 0; } else if (cnt == n && len == n) { cout << "Sorted sequence determined after " << i << " relations: " << ans << "."; return 0; } } if (cnt != n || len != n) cout << "Sorted sequence cannot be determined."; return 0; }
|