【洛谷P2814】家谱
今天学了一种新的STL(笑)
先看题目
P2814 家谱
题目背景
现代的人对于本家族血统越来越感兴趣。
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入格式
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用 #name
的形式描写一组父子关系中的父亲的名字,用 +name
的形式描写一组父子关系中的儿子的名字;接下来用 ?name
的形式表示要求该人的最早的祖先;最后用单独的一个 $
表示文件结束。
输出格式
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式为:本人的名字 \(+\) 一个空格 \(+\) 祖先的名字 \(+\) 回车。
输入输出样例 #1
输入 #1
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出 #1
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
说明/提示
规定每个人的名字都有且只有 \(6\) 个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有 \(10^3\) 组父子关系,总人数最多可能达到 \(5 \times 10^4\) 人,家谱中的记载不超过 \(30\) 代。
解法&&个人感想
个人感觉这题的并查集思路不是很复杂
但是看到字符串就有点犯怵
因此 我们介绍一种数据结构:map
map其实是一种映射 一般的写法是map<数据类型,数据类型>变量名
表示第一数据类型映射到第二数据类型
然后一般的调用写法是变量名[第一数据类型]=第二数据类型
好了 这样就很好做了
同时介绍一下map里面好用的成员函数
a.count(某个变量)在a里面找寻某个变量 如果存在返回1 不存在返回0
a.erase(某个变量)在a中删除以某个变量为下标的元素
a.size()计算a中元素个数
a.clear() 清空a
这些函数在后面会有很大的用处
下面看代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<string,string>fa;
char c;
string ance,son,s;
string get(string x){
if(fa[x]==x) return x;
return fa[x]=get(fa[x]);
}
int main(){
while(cin>>c&&c!='$'){
if(c=='#'){
cin>>s;
ance=s;
if(fa[s]=="") fa[s]=s;
}
else if(c=='+'){
cin>>s;
fa[s]=ance;
}
else{
cin>>s;
cout<<s<<' '<<get(s)<<endl;
}
}
system("pause");
return 0;
}