給定 n 個大寫字母(n ≤ 26)和 m 條關系 A<B。逐條讀入關系,判斷:
Sorted sequence determined after k relations: ...Inconsistency found after k relations.Sorted sequence cannot be determined.由於 n ≤ 26,每讀入一條邊就跑一次 Kahn 拓撲排序(O(n+m)),總複雜度 O(m(n+m)) ≤ 26×52 微乎其微。
multiple = true。!multiple → 排序唯一確定。#includeusing namespace std; const int MAXN = 30; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; while (cin >> n >> m, n || m) { vector > adj(n); vector indeg(n); vector > edges; int determined = -1, inconsistent = -1; string rel; for (int i = 0; i < m; ++i) { cin >> rel; int u = rel[0] - 'A', v = rel[2] - 'A'; edges.emplace_back(u, v); if (determined != -1 || inconsistent != -1) continue; // 重建圖並拓撲 fill(indeg.begin(), indeg.end(), 0); for (auto &e : edges) { adj[e.first].push_back(e.second); ++indeg[e.second]; } queue q; for (int j = 0; j < n; ++j) if (indeg[j] == 0) q.push(j); vector seq; bool multi = false; while (!q.empty()) { if (q.size() > 1) multi = true; int u = q.front(); q.pop(); seq.push_back(u); for (int v : adj[u]) if (--indeg[v] == 0) q.push(v); } if ((int)seq.size() < n) inconsistent = i + 1; else if (!multi) determined = i + 1; adj.assign(n, {}); // 清空供下輪 } if (determined != -1) { cout << "Sorted sequence determined after " << determined << " relations: "; for (int x : seq) cout << char('A' + x); cout << ".\n"; } else if (inconsistent != -1) { cout << "Inconsistency found after " << inconsistent << " relations.\n"; } else { cout << "Sorted sequence cannot be determined.\n"; } } return 0; }
POJ 1094 是「動態拓撲排序判斷」的教科書級題目。核心模板:Kahn 算法 + 隊列大小判唯一 + 節點數判環。同類模板適用於 HDU 1285、Codeforces 圖論判斷題。