【问题描述】 有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。 给出每个人的孩子的信息。 输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】 第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
题意:第i行为i的儿子,以0作为结束,将辈分高的先输出。拓扑排序算法
#include<iostream>
#include<cstdio>
using namespace std;
int r[101],c[101];
int a[101][101], ans[101];
int num, tot, temp, n, j, i;
int main()
{
cin >> n;
for (i = 1; i <= n; i++)
{
do
{
cin >> j;
if (j != 0)
{
c[i]++;//表示i点的出度
a[i][c[i]] = j;
r[j]++;//存j点的入度
}
}
while (j != 0);
}
for (i = 1; i <= n; i++)
{
if (r[i] == 0)
ans[++tot] = i;//把图中所有入度为零的点入栈,栈用一维数组按时ans[]表示
}
do
{
temp = ans[tot];
cout << temp << " ";
tot--; num++;
for (i = 1; i <= c[temp]; i++)
{
r[a[temp][i]]--;
if (r[a[temp][i] ]== 0)//如果入度减一后变成0,后继点入栈
ans[++tot] = a[temp][i];
}
}
while (num != n);//输出点的数目等于n时,算法结束
system("pause");
return 0;
}