#include<bits/stdc++.h> usingnamespace std; constint maxn = 30; int n, m; int d[maxn][maxn], f[maxn][maxn];
intfloyd(){ memcpy(f, d, sizeof(d)); for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { f[i][j] |= f[i][k] & f[k][j]; // 存在环,矛盾 if (f[i][j] == 1 && f[j][i] == 1) return-1; } } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (i != j && f[i][j] == 0 && f[j][i] == 0) return0; } } return1; }
voidprint(){ // pair<字符的关系个数,字符> pair<int, char> ans[maxn]; for (int i = 0; i < n; ++i) ans[i].first = 0, ans[i].second = 'A' + i; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (f[i][j]) ++ans[i].first; sort(ans, ans + n); for (int i = n - 1; i >= 0; --i) cout << ans[i].second; puts("."); }
voidwork(){ char s[6]; memset(d, 0, sizeof(d)); bool flag = 1; for (int u, v, i = 1; i <= m; ++i) { scanf("%s", s); u = s[0] - 'A', v = s[2] - 'A'; // 尽管本轮得到了答案,但是要继续读入剩余无用数据 if (!flag) continue; d[u][v] = 1; int res = floyd(); if (res == -1) { printf("Inconsistency found after %d relations.\n", i), flag = 0; } elseif (res == 1) { printf("Sorted sequence determined after %d relations: ", i), flag = 0; print(); } } if (flag) puts("Sorted sequence cannot be determined."); }
intmain(){ while ((cin >> n >> m) && n) work(); return0; }
#include<bits/stdc++.h> usingnamespace std; constint maxn = 1e5; int n, m, tot = -1; int head[30], ver[maxn], nxt[maxn], edge[maxn]; int tind[maxn], ind[maxn], step[maxn]; string ans;
voidadd(int u, int v, int w){ ver[++tot] = v, edge[tot] = w, nxt[tot] = head[u], head[u] = tot; }
inttoposort(){ memcpy(tind, ind, sizeof(ind)); // 每个节点默认的最长路为1,就是它自己 for (int i = 0; i < n; ++i) step[i] = 1; ans = ""; queue<int> q; for (int i = 0; i < n; ++i) if (!tind[i]) q.push(i); int cnt = 0; while (!q.empty()) { int u = q.front(); q.pop(); ++cnt; ans += (char)('A' + u); for (int i = head[u]; ~i; i = nxt[i]) { int v = ver[i]; if (--tind[v] == 0) q.push(v), step[v] = max(step[v], step[u] + 1); } } // 有环,代表矛盾 if (cnt < n) return-1; int mx = INT_MIN; for (int i = 0; i < n; ++i) mx = max(mx, step[i]); if (mx == n) return1; return0; }
voidwork(){ char s[6]; memset(ind, 0, sizeof(ind)), memset(head, -1, sizeof(head)), tot = -1; bool flag = 1; for (int u, v, i = 1; i <= m; ++i) { scanf("%s", s); u = s[0] - 'A', v = s[2] - 'A'; // 尽管本轮得到了答案,但是要继续读入剩余无用数据 if (!flag) continue; add(u, v, 1), ++ind[v]; int res = toposort(); if (res == -1) { printf("Inconsistency found after %d relations.\n", i), flag = 0; } elseif (res == 1) { printf("Sorted sequence determined after %d relations: %s.\n", i, ans.c_str()), flag = 0; } } if (flag) puts("Sorted sequence cannot be determined."); }
intmain(){ while ((cin >> n >> m) && n) work(); return0; }
#include<bits/stdc++.h> usingnamespace std; constint maxn = 1e5; int n, m, tot = -1; int head[30], ver[maxn], nxt[maxn], edge[maxn]; int tind[maxn], ind[maxn]; string ans;
voidadd(int u, int v, int w){ ver[++tot] = v, edge[tot] = w, nxt[tot] = head[u], head[u] = tot; }
inttoposort(){ memcpy(tind, ind, sizeof(ind)); ans = ""; queue<int> q; for (int i = 0; i < n; ++i) if (!tind[i]) q.push(i); int cnt = 0; bool flag = 1; while (!q.empty()) { // 同一时刻有多个入度为0的节点,说明拓扑序不唯一,最长路必不可能等于n // 但不能直接return 0,同时有环和拓扑序列的情况下,有环的优先级更高 if (q.size() > 1) flag = 0; int u = q.front(); q.pop(); ++cnt; ans += (char)('A' + u); for (int i = head[u]; ~i; i = nxt[i]) { int v = ver[i]; if (--tind[v] == 0) q.push(v); } } // 节点没有全部出队,代表有环 if (cnt < n) return-1; if (flag && ans.length() == n) return1; return0; }
voidwork(){ char s[6]; memset(ind, 0, sizeof(ind)), memset(head, -1, sizeof(head)), tot = -1; bool flag = 1; for (int u, v, i = 1; i <= m; ++i) { scanf("%s", s); u = s[0] - 'A', v = s[2] - 'A'; // 尽管本轮得到了答案,但是要继续读入剩余无用数据 if (!flag) continue; add(u, v, 1), ++ind[v]; int res = toposort(); if (res == -1) { printf("Inconsistency found after %d relations.\n", i), flag = 0; } elseif (res == 1) { printf("Sorted sequence determined after %d relations: %s.\n", i, ans.c_str()), flag = 0; } } if (flag) puts("Sorted sequence cannot be determined."); }
intmain(){ while ((cin >> n >> m) && n) work(); return0; }