描述
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
这题比较简单,直接BFS先序遍历树就行了,下面是代码
#include<bits/stdc++.h>
using namespace std;
int n;
int arr[10001],child[10001];
int root[10001];
string str,arr2[10001];
map<string,int> m;
vector<int> v[10001];
void print(int num)
{
if(num && arr[num])
cout << arr2[num] <<endl;
if(v[num].size())
{
int length = v[num].size();
for(int i = 0;i < length;++i)
print(v[num][i]);
}
}
int main()
{
cin >> n;
cin >> str;
memset(arr,1,sizeof(arr));
m[str] = 0;
arr2[0] = str;
for(int i = 1;i <= n;++i)
{
string str1,str2,str3;
cin >> str1;
if(str1 == "death")
{
cin >> str2;
if(m.find(str2) != m.end())
arr[m[str2]] = 0;
}
else
{
cin >> str2;
if(m.find(str2) != m.end())
{
int num = m[str2];
root[i] = num;
v[num].push_back(i);
}
cin >> str3;
m[str3] = i;
arr2[i] = str3;
}
}
print(0);
return 0;
}