拓扑排序
样题:
家谱树【拓扑排序模板】
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息,输出一个序列,使得每个人的后辈都比那个人后列出。
输入格式
第 1 行一个整数 N(1<=N<=100),表示家族的人数。
接下来 N 行,第 I 行描述第 I 个人的儿子。
每行最后是 0 表示描述完毕。
输出格式
输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。
样例数据 1
输入 [复制]
5
0
4 5 1 0
1 0
5 3 0
3 0
输出
2 4 5 3 1
std.cpp:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
using namespace std;
const int kkk = 150;
int n,k,x,u,v,val;
int first[kkk];
struct node{int u,v,val,next;}side[2*kkk];
int cnt=1;
void addedge(int u,int v,int val)
{
side[++cnt].u = u;
side[cnt].v = v;
side[cnt].val = val;
side[cnt].next = first[u];
first[u] = cnt;
}
bool visit[kkk];
int in[kkk],out[kkk];
void judge()
{
int sum=0;
while(sum!=n)
for(u=1;u<=n;u++)
if(!in[u]&&!visit[u])
{
visit[u] = true;
cout << u << " ";
for(int i=first[u];i;i=side[i].next)
{
v = side[i].v;
in[v]--;
out[u]--;
}
sum++;
}
}
int main()
{
cin >> n;
for(u=1;u<=n;u++)
while(cin>>v&&v)
{
addedge(u,v,1);
in[v]++;out[u]++;
}
judge();
}