拓扑排序可以用来判断一个有向图是否有环,有环则无拓扑序列。
但拓扑排序的写法可以用栈,也可以用队列来实现。
家谱树:
【题目描述】 有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。 给出每个人的孩子的信息。 输入一个序列,使得每个人的后辈都比那个人后列出。
【输入】 第一行一个整数(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<cstdio>
using namespace std;
int n;
int r[105],c[105],a[105][105];//r为入度,c为出度,a用二维数组存储第i个点发出的j条边到达的点
int st[105],top=0;//数组模拟栈
void topsort()
{
for(int i=1;i<=n;i++)
if(r[i]==0)st[++top]=i;//将入度为0的点i入栈
int x;
while(top>0){
x=st[top];//取出一个入度为0的点
printf(