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