版权声明:转载请注明出处链接 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