1351: 家谱树

【题目描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入】
第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
标准的拓扑排序算法,书上用栈结构我觉得没必要,用数组v记录下已经选出的点就行了。

#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;/**< 拓扑排序:要点是选中入度为0的点 */
int n,f[101][101],d[101],v[101];
int main()
{
    memset(d,0,sizeof(d));
    memset(v,0,sizeof(v));
    int i,j,k;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        while(cin>>k&&k!=0)
        {
            f[i][k]=1;
            d[k]++; /**< 邻接矩阵存储,同时记录入度 */
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++) /**< 查找第一个未被列出入度为0的点 */
        {
            if(v[j]==0&&d[j]==0)
                break;
        }
        v[j]=1;
        cout<<j<<' ';
        for(k=1;k<=n;k++) /**< 把j的邻接点入度-1,相当于删除掉j这个点后的状态 */
        {
            if(f[j][k]==1)
                d[k]--;
        }
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
家谱(gen)是一个记录了多代人父子关系的文件。其中每组父子关系由两行组成,第一行用#name的形式表示父亲的名字,第二行用name的形式表示儿子的名字。家谱中可能有多组父子关系,最多1000组。每个人的名字都有6个字符,首字母大写,并且没有重复的名字。家谱中的人数最多为50000人,世系最多为30代。在家谱中,使用?name的形式表示查询某个人的最早祖先,$表示文件结束。可以使用的双亲表示法或者字符串表示法来记录人与人之间的关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [1388:家谱(gen)](https://blog.csdn.net/C_Dreamy/article/details/105642697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ybt1388:家谱(gen)](https://blog.csdn.net/youyi2008/article/details/120816493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [信息学奥赛一本通 1388:家谱(gen) | 洛谷 P2814 家谱](https://blog.csdn.net/lq1990717/article/details/129754740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值