zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    MVC 数据库增删改查(2) 视图
    MVC 数据库增删改查(1)
    委托的4种写法
    wpf 多线程操作(2)
    wpf 多线程操作例(1)
    网络抓取邮箱
    wpf 点击新建弹出新的窗口
    wpf 数据绑定 联系
    wpf 在listview里添加数据
    面向对象:抽象基类,接口
  • 原文地址:https://www.cnblogs.com/gaojs/p/15584362.html
Copyright © 2011-2022 走看看