描述
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;
}