题目描述:
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的孩子都比那个人后列出。
输入格式
第 1 行一个整数 n,表示家族的人数;
接下来 n 行,第 i 行描述第 i 个人的孩子;
每行最后是 0 表示描述完毕。
每个人的编号从 1 到 n。
输出格式
输出一个序列,使得每个人的孩子都比那个人后列出;
数据保证一定有解,如果有多解输出任意一解。
数据范围
1≤n≤100
输入样例:
5
0
4 5 1 0
1 0
5 3 0
3 0
输出样例:
2 4 5 3 1
思路:
拓扑排序
代码:
#include <iostream>
#include<queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+10,M=1e6+10;
int e[M],h[N],w[M],ne[M],idx;
void add(int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int din[N];
int main()
{
memset(h, -1, sizeof h);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
while(cin>>t)
{
if(t==0)
{
break;
}
add(i,t);
din[t]++;
}
}
queue<int>q;
for(int i=1;i<=n;i++)
{
if(!din[i])
{
q.push(i);
}
}
while(!q.empty())
{
int t=q.front();
q.pop();
cout<<t<<' ';
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
din[j]--;
if(!din[j])
{
q.push(j);
}
}
}
}
1994

被折叠的 条评论
为什么被折叠?



