1351:【例4-12】家谱树


【题目描述】

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。

给出每个人的孩子的信息。

输出一个序列,使得每个人的后辈都比那个人后列出。

【输入】

第1行一个整数N">NN(1N100">1N1001≤N≤100),表示家族的人数;

接下来N">NN行,第i">ii行描述第i">ii个人的儿子;

每行最后是0">00表示描述完毕。

【输出】

输出一个序列,使得每个人的后辈都比那个人后列出;

如果有多解输出任意一解。

【输入样例】

5
0
4 5 1 0
1 0
5 3 0
3 0

【输出样例】

2 4 5 3 1

#include 
using namespace std;


void show(vector> &a)
{
    for (int i = 1; i < a.size(); i++) {
        cout << i << ": ";
        for (int j = 0; j < a[i].size(); j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
}

void show(vector &a)
{
    for (int i = 1; i < a.size(); i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

vector topo(vector> &a)
{
    vector ans;
    vector visited(a.size());
    while (ans.size() < a.size() - 1) {
        vector inDeg(a.size()); // 入度
        for (int i = 1; i < a.size(); i++) {
            if (visited[i]) {
                continue;
            }
            for (int j = 0; j < a[i].size(); j++) {
                inDeg[a[i][j]] += 1;
            }
        }
        // show(inDeg);
        for (int i = 1; i < inDeg.size(); i++) {
            if (visited[i]) {
                continue;
            }
            if (inDeg[i] == 0) {
                ans.push_back(i);
                visited[i] = true;
            }
        }
    }
    return ans;
}


int main()
{
    // freopen("in.txt", "r", stdin);
    int n; // n行
    scanf("%d", &n);
    // cout << n << endl;
    vector> a(n + 1); // 邻接表
    for (int i = 1; i < a.size(); i++) {
        for (;;) {
            int x;
            scanf("%d", &x);
            if (x == 0) {
                break;
            }
            a[i].push_back(x);
        }
    }
    // show(a);
    vector ans = topo(a);
    for (auto &a : ans) {
        printf("%d ", a);
    }
    return 0;
}

相关