#1716 : 继承顺位(dfs)

描述

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

只是需要按照题目给的顺序dfs暴力搜索一遍就好了


代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn=11000;
map<string,int>G;
map<int,string>F;
int vi[maxn];
vector<int>Q[maxn];
void dfs(int x)
{
    //cout<<11<<endl;
    for(int i=0;i<Q[x].size();i++)
    {
        //cout<<11<<endl;
        int v=Q[x][i];
        if(!vi[v])
        {
            cout<<F[v]<<endl;
        }
        vi[v]=1;
        dfs(v);
    }
}
int main()
{
    int n;
    char a[10];
    int ans=1;
    string root;
    cin>>n>>root;
    G[root]=ans++;
    F[ans-1]=root;
    vi[1]=1;
    string s1,s2;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",a);
        if(a[0]=='b')
        {
            cin>>s1>>s2;
            if(G[s1]==0)
            {
                G[s1]=ans++;
                F[ans-1]=root;
            }
            if(G[s2]==0)
            {
                G[s2]=ans++;
                F[ans-1]=s2;
            }
            Q[G[s1]].push_back(G[s2]);
        }
        else
        {
            string s;
            cin>>s;
            vi[G[s]]=1;
        }
    }

    dfs(1);

    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值