AcWin-1253.家谱

92 阅读1分钟
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