题目大意:给出一些父子的关系,求他们的最远祖先。
解题思路:并查集题目,但给出的是名字,所以要用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; }