【洛谷P 2814 &SSL 2343】家谱【字符串并查集】

题目背景

现代的人对于本家族血统越来越感兴趣。

题目描述

给出充足的父子关系,请你编写程序找到某个人的最早的祖先。

输入格式

输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用 #name 的形式描写一组父子关系中的父亲的名字,用 +name 的形式描写一组父子关系中的儿子的名字;接下来用 ?name 的形式表示要求该人的最早的祖先;最后用单独的一个 $ 表示文件结束。

输出格式

按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式为:本人的名字 ++ 一个空格 ++ 祖先的名字 ++ 回车。

输入输出样例

输入 #1

#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$

输出 #1

Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur

分析:

并查集找祖先 如果没有祖先自己就是祖先
while读入 由于是字符串 find函数也是string类型的
要用一个map映射 不然很麻烦

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
char c;
string son,father;
map<string,string> s;  //map表示集合
string found(string x){  //找祖先函数
	if(s[x]!=x) return s[x]=found(s[x]);
	else return s[x]; 
}
int main(){
	ios::sync_with_stdio(false);
	cin>>c;
	while(c!='$')  //while反复读入
	{
		cin>>son;
		if(c=='#')   //自己是爹
		{
			father=son;
			if(s[son]=="")//ta没有祖先
			s[son]=son;  //即是自己
		}else{
			if(c=='+')  //自己是儿子
			{
				s[son]=father;  //爹就是祖先
			}else{
				father=found(son);  //找祖先
				cout<<son<<" "<<father<<endl;
			}
		}
		cin>>c;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dgssl_xhy/article/details/107484850
今日推荐