1 条题解

  • 0
    @ 2026-10-26 22:20:37

    思路与算法

    祖辈指向后辈构成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

    信息

    ID
    1886
    时间
    1000ms
    内存
    64MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者