• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
山不在高,有金则名!
博客园    首页    新随笔    联系   管理    订阅  订阅

1351:【例4-12】家谱树

【题目描述】

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

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

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

【输入】

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

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

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

【输出】

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

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

【输入样例】

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

【输出样例】

2 4 5 3 1

#include <bits/stdc++.h>
using namespace std;


void show(vector<vector<int>> &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<int> &a)
{
    for (int i = 1; i < a.size(); i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

vector<int> topo(vector<vector<int>> &a)
{
    vector<int> ans;
    vector<bool> visited(a.size());
    while (ans.size() < a.size() - 1) {
        vector<int> 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<vector<int>> 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<int> ans = topo(a);
    for (auto &a : ans) {
        printf("%d ", a);
    }
    return 0;
}

  

posted @ 2021-11-21 14:18  杭州山不高  阅读(379)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3