题目背景
现代的人对于本家族血统越来越感兴趣。
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入输出格式
输入格式:
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。
输出格式:
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
输入输出样例
输入样例#1:
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出样例#1:
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
解题思路
map + 并查集;
代码如下
1 #include<map> 2 #include<iostream> 3 using namespace std; 4 map<string, string> father; 5 string getf(string x){ 6 if(x == father[x]) return x; 7 else return father[x] = getf(father[x]); 8 } 9 int main(){ 10 string fath; 11 while(1){ 12 string son, temp; 13 char c; 14 cin >> c; 15 if(c == '$') break; 16 else if(c == '#'){ 17 cin >> fath; 18 if(father[fath] == "") father[fath] = fath; 19 } 20 else if(c == '+'){ 21 cin >> son; 22 father[son] = fath; 23 } 24 else if(c == '?'){ 25 cin >> temp; 26 cout << temp << " " << getf(temp) << endl; 27 } 28 } 29 return 0; 30 }
注意点
变量定义的位置得仔细考虑一下;