「LGOJ」家谱
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入格式
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用 #name 的形式描写一组父子关系中的父亲的名字,用 +name 的形式描写一组父子关系中的儿子的名字;接下来用 ?name 的形式表示要求该人的最早的祖先;最后用单独的一个 $ 表示文件结束。
题解
找父亲可以马上想到并查集
但是这里的值都是字符串啊,怎么办呢qwq?
这时候就可以用map了 (STL大法好!
map <string,string> fa;
意思为建立一个特殊的数组,数组下标类型为string,数组存放的数据也是string类型的。然而它的本质还是普通数组,此处是将string类映射成int型。
此处用了map,就可以将输入的名字当成一个个整数(点),进行普通并查集即可。
Code
#include <bits/stdc++.h>
using namespace std;
#define RE register
map <string,string> fa;//映射qwq
string s,now;
char ch;
inline void fread(int &x){//快读
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
inline string find(string x){//寻找父亲
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int main(){
cin>>ch;//注意这里要先输入再进入while,不然前面ch都为空
while(ch!='$'){
cin>>s;
if(ch=='#'){
now=s;
if(fa[now]=="")fa[now]=now;//如果它不是儿子就创建一个父亲
}
if(ch=='+'){
fa[s]=now;//合并qwq
}
if(ch=='?')cout<<s<<" "<<find(s)<<endl; //输出
cin>>ch;
}
return 0;
}

浙公网安备 33010602011771号