[洛谷P2814]家谱
题目大意:给出一些父子的关系,求他们的最远祖先。
解题思路:并查集题目,但给出的是名字,所以要用map给每个人的名字编号。
C++ Code:
#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string,int>p;
string pp[50500];
string s;
int cnt;
int fa[50500];
int dad(int x){return(fa[x]==x)?(x):(fa[x]=dad(fa[x]));}
char ch;
int main(){
ios::sync_with_stdio(false);
cnt=0;
for(int i=1;i<=50005;++i)
fa[i]=i;
cin>>ch;
while(ch!='?'){
cin>>s;
if(!p.count(s))p[s]=++cnt,pp[cnt]=s;
int f=p[s];
while(cin>>ch&&ch=='+'){
cin>>s;
if(!p.count(s))p[s]=++cnt,pp[cnt]=s;
int sn=p[s];
int df=dad(f),ds=dad(sn);
if(df!=ds)
fa[ds]=df;
}
}
while(ch!='$'){
cin>>s;
cout<<s<<' '<<pp[dad(p[s])]<<endl;
cin>>ch;
}
return 0;
}

浙公网安备 33010602011771号