家谱树(拓扑排序)

匿名 (未验证) 提交于 2019-12-02 23:40:02
版权声明:转载请注明出处链接 https://blog.csdn.net/qq_43408238/article/details/91392727

【题目描述】

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

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

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

【输入】

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

接下来N行,第I行描述第I个人的儿子;

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

【输出】

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

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

【输入样例】

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

【输出样例】

 2 4 5 3 1 

  #include<iostream> #include<vector> #include<string> #include<cstring> #include<cmath> #include<stack> #include <algorithm> #include <stdlib.h> #include <cstdio> #include<sstream> #include<cctype> #include <set> #include<queue> #include <map> #include <iomanip> #define INF 0x3f3f3f3f #define eps 0.000000001 #define maxn  (int)1e5+10 using namespace std; typedef pair<int,int> pii; int ans[101][101]; int r[101]; int c[101]; stack<int> v; int main() {     int T,n,m;     cin>>T;     for(int i=1;i<=T;++i)     {         while(cin>>n&&n)         {             c[i]++;//c[]存i的出度             ans[i][c[i]]=n;//存与i相连的节点             r[n]++;//r[]c存n的入度         }     }     for(int i=1;i<=T;++i)     {         if(!r[i]) v.push(i);//入度为0,进栈     }     int num=0;     do     {         int temp=v.top();v.pop();//出栈         num++;         cout<<temp<<" ";         for(int i=1;i<=c[temp];++i)//所有与出栈的边相连的节点入度-1         {         r[ans[temp][i]]--;         if(r[ans[temp][i]]==0){//若有入度为零的节点,入栈             v.push(ans[temp][i]);         }         }     }while(num!=T);     return 0; } 

文章来源: https://blog.csdn.net/qq_43408238/article/details/91392727
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!