继承顺位

本文介绍了一个基于树形结构的算法,用于计算H国国王后代的继承顺位。通过输入国王后代的出生和死亡记录,算法能够正确地确定活着的后代的继承顺序。使用了C++的map和queue数据结构来实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述H国的国王有很多王子,这些王子各自也都有很多王孙,王孙又各自有很多后代…… 总之,H国王族的族谱形成了一棵以国王为根的树形结构。  

根据H国的法律,王族的继承顺位这样规定的:假设A和B是两位王族

1. 如果其中一位是另一位的直系父亲、祖先,则辈份高的王族继承顺位更高  

2. 否则,假设C是A和B的最近公共祖先。显然A和B一定是C的两位不同子嗣的后代。其中C较年长的子嗣的后代的继承顺位更高

按时间顺序给出所有国王后代的出生和死亡记录,请你计算所有还活着的后代的继承顺位。

输入

第一行包含一个整数N和一个只包含大写字母和数字的字符串,分别代表记录的条数和国王的名字。

 以下N行每行包含一条记录:

birth name1 name2 代表name1的儿子name2出生  

death name 代表name死亡  

1 <= N <= 10000  

名字长度不超过20,并且没有重名的王族。

输出

按继承顺位从高到低输出每位王族的名字。(不包括国王)

每个名字一行。

样例输入

4 KING  
birth KING ALI
birth KING BOB
birth ALI CARRO   
death ALI

样例输出

CARRO 

BOB

参考:https://blog.youkuaiyun.com/July_xunle/article/details/79822510

#include<iostream>
#include<string>
#include<map>
/*Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。*/
#include<queue>
using namespace std;
map<string,queue<string> > m;//继承顺位:关键字:字符串型;值:字符串型队列
map<string,int> d;
void dfs(string s)
{
    while(!m[s].empty())//有子孙
    {
        string name=m[s].front();//map中的第一个元素 
        if(d[name]!=1) 
        {
            cout<<name<<endl;
        }
        dfs(name);
        m[s].pop();
    }
}
int main()
{
    int n,i;
    string king,f,fname,cname,dead;
    cin>>n;//记录条数 
    cin>>king;//国王名字 
    d[king]=1;
    for(i=0;i<n;i++)
    {
        cin>>f; 
        if(f=="birth")//输入birth
        {
            cin>>fname>>cname;
            m[fname].push(cname);
        }
        else//输入dead
        {
            cin>>dead;
            d[dead]=1;
        }
    }
    dfs(king);
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值