1253. 家谱 - AcWing题库
思路
- 虽然不难看出这是一道并查集的题,但由于输入的都是字符串,那么能想到可以借用 map 键值对容器构建,将并查集中常用的数组存储换为使用 map 存储即可。
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int fast_io=[](){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
return 0;
}();
map<string,string> mp;
inline string find(string x){
if(mp[x]==x)
return x;
return mp[x]=find(mp[x]);
}
int main(){
char ch;
string name,fa;
while(cin>>ch){
if(ch=='$')
return 0;
cin>>name;
if(ch=='#'){
fa=name;
if(mp[name]=="")
mp[name]=name;
}
else if(ch=='+')
mp[name]=fa;
else
cout << name << " " << mp[find(name)] << endl;
}
return 0;
}
题面
现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入格式
首先是一系列有关父子关系的描述, 其中每一组父子关系由二行组成, 用 #name 的形式描写一组父子关系中的父亲的名字, 用 +name 的形式描写一组父子关系中的儿子的名字, 接下来用 ?name 的形式表示要求该人的最早的祖先,最后用单独的一个$表示文件结束。
规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。
输出格式
按照输入的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字 + 一个空格 + 祖先的名字 + 回车。
数据范围
- 最多可能有10000组父子关系。
- 输入数据不超过20010行。
- 数据中涉及到的人数不超过10000。
输入样例:
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出样例:
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur