[SSL] 2343 y [Luogu] P2814 genealogía (y colección)

[SSL] 2343 y [Luogu] P2814 genealogía (y colección)

Límite de tiempo: 1000MS
Límite de memoria: 65536K

Descripción

La gente moderna se está interesando cada vez más en la ascendencia de su familia. Ahora que existe suficiente relación entre padres e hijos, por favor escriba un programa para encontrar el antepasado más antiguo de alguien.

Entrada

El archivo de entrada se compone de varias líneas. La primera es una serie de descripciones sobre la relación entre padres e hijos. Cada relación entre padres e hijos consta de dos líneas. El nombre del padre en la relación entre padres e hijos se describe en la forma de #nombre, y el nombre del padre en la relación padre-hijo se describe en la forma de + nombre. El nombre del hijo en un conjunto de relaciones padre-hijo; a continuación, utilice la forma de? nombre para indicar la primera antepasado que solicitó a la persona; finalmente, use un solo $ para indicar el final del archivo. Se estipula que el nombre de todos tiene y solo tiene 6 caracteres, y la primera letra está en mayúscula y no hay dos personas con el mismo nombre. Puede haber hasta 1,000 grupos de relaciones entre padres e hijos, el número total puede llegar hasta 50,000 y el árbol genealógico registra no más de 30 generaciones.

Salida

De acuerdo con el orden requerido del archivo de entrada, busque los antepasados ​​de cada persona que busque antepasados, en el formato: nombre personal + un espacio + nombre del antepasado + retorno de carro.

Entrada de muestra

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

Salida de muestra

Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur 

Ideas

Usa el mapa y revisa la colección.

Código

#include<iostream>
#include<cstdio>
#include<map> 
using namespace std;
map<string,string> f;//用map,下标,值string
string find(string x)//找代表值 
{
    
    
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
int main()
{
    
    
	string str,fa;
	char t;
	for(cin>>str;str[0]!='$';cin>>str)
	{
    
    
		t=str[0];
		str.erase(0,1);
		if(f[str]=="") f[str]=str;
		if(t=='#') fa=str;//保存父亲 
		else if(t=='+') f[find(str)]=find(fa);//合并 
		else if(t=='?') cout<<str<<' '<<find(str)<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46975572/article/details/112978023
Recomendado
Clasificación