0
点赞
收藏
分享

微信扫一扫

拓扑排序算法(AOV)简单例题 【例4-12】、家谱树

彭维盛 2023-02-08 阅读 90



【例4-12】、家谱树

【问题描述】

    有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。

    给出每个人的孩子的信息。

    输出一个序列,使得每个人的后辈都比那个人后列出。

【输入格式】

    第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<bits/stdc++.h>
using namespace std;
#define N 105
int n;
int a[N][N],ans[N],r[N],c[N],tot,num;
int main()
{

scanf("%d",&n); int j;
for(int i=1;i<=n;i++)
{
do
{

scanf("%d",&j);
if(j!=0)
{
c[i]++; //出度+1
a[i][c[i]]=j;
r[j]++; //入度+1
}

}while(j!=0);
}
for(int i=1;i<=n;i++)
if(r[i]==0)
ans[++tot]=i;//记录入度为0的点,并将所有大的入栈
int num=0;
do
{
int t=ans[tot];
cout<<t<<" ";//栈顶元素出栈并输出
tot--;
num++;
for(int i=1;i<=c[t];i++)
{
r[a[t][i]]--;
if(r[a[t][i]]==0)//入度为0,后继点入栈
ans[++tot]=a[t][i];
}
}while(num!=n);
return 0;
}


举报

相关推荐

0 条评论