【题目】
题目描述:
现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入格式:
输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用 # n a m e name name 的形式描写一组父子关系中的父亲的名字,用 + n a m e +name +name 的形式描写一组父子关系中的儿子的名字;接下来用 ? n a m e ?name ?name 的形式表示要求该人的最早的祖先;最后用单独的一个 $ 表示文件结束。规定每个人的名字都有且只有 6 6 6 个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有 1000 1000 1000 组父子关系,总人数最多可能达到 50000 50000 50000 人,家谱中的记载不超过 30 30 30 代
输出格式:
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
样例数据:
输入
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
【分析】
题解:并查集模板题
之前看到这道题有字符串操作那些就一直没敢做,今天考模板的时候就考到了,其实也没想象中那么难
这道题主要的难点就是如何对字符串操作吧(并查集那些都直接上模板)
其实只要会用
m
a
p
map
map 就行了,就是直接用
s
t
r
i
n
g
string
string 来代替
i
n
t
int
int,然后就是板子题了
【代码】
#include<map>
#include<cstdio>
#include<iostream>
using namespace std;
map<string,string>father;
string find(string x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
int main()
{
char c;
string s,anc;
cin>>c;
while(c!='$')
{
cin>>s;
if(c=='#')
{
anc=s;
if(father[s]=="")
father[s]=s;
}
else if(c=='+') father[s]=anc;
else cout<<s<<' '<<find(s)<<'\n';
cin>>c;
}
return 0;
}