• 1351:【例412】家谱树


    【题目描述】

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

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

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

    【输入】

    第1行一个整数NN(1N1001≤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;
    }
    

      

  • 相关阅读:
    vue学习之vuex的入门
    Vue的入门之安装
    JS之作用域链
    map去重value值
    增量部署和全量部署
    js跳转页面的方法
    Quartz定时任务时间设置
    @RequestParam和@PathVariable用法小结
    nginx负载均衡的5种策略(转载)
    使用Joda-Time优雅的处理日期时间
  • 原文地址:https://www.cnblogs.com/gaojs/p/15584362.html
Copyright © 2020-2023  润新知