[洛谷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;
}

 

posted @ 2017-08-07 20:09  Mrsrz  阅读(192)  评论(0编辑  收藏  举报