[hihocoder] #1716 : 继承顺位(dfs深搜)

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

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


一个比较特别的深搜题,为了方便用了map做了处理

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define inf 0x3f3f3f
#define ll long long
#define mod 1000000007
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();
        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")
        {
            cin>>fname>>cname;
            m[fname].push(cname);
        }
        else
        {
            cin>>dead;
            d[dead]=1;
        }
    }
    dfs(king);
}

猜你喜欢

转载自blog.csdn.net/july_xunle/article/details/79822510