1 条题解
-
0
思路与算法
祖辈指向后辈构成DAG,Kahn每次输出当前入度零的人;题面章节虽在最小生成树,但实际考核拓扑排序,不套MST标签。
按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。
正确性说明
任何入度为零的人都没有尚未输出的祖先,故可安全输出。删去他到后辈的边后维持该不变量;有限DAG必有入度零节点,因此最终输出全部人且每条祖先边方向合法。
复杂度
O(n+m)时间、O(n+m)空间,含入度和邻接表初始化。
易错点
多解输出任意合法顺序;不能按源章节错误地使用最小生成树。每人列表以0结尾,0不是人。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<vector<int>> g(n + 1); vector<int> d(n + 1); for (int i = 1; i <= n; i++) { int x; while (cin >> x && x) { g[i].push_back(x); d[x]++; } } queue<int> q; for (int i = 1; i <= n; i++) if (!d[i]) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); cout << u << ' '; for (int v : g[u]) if (!--d[v]) q.push(v); } cout << "\n"; }
- 1