題目描述
給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。
輸入格式
輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用 #name 的形式描寫一組父子關係中的父親的名字,用 +name 的形式描寫一組父子關係中的兒子的名字;接下來用 ?name 的形式表示要求該人的最早的祖先;最後用單獨的乙個 $ 表示檔案結束。
輸出格式
按照輸入檔案的要求順序,求出每乙個要找祖先的人的祖先,格式為:本人的名字 ++ 乙個空格 ++ 祖先的名字 ++ 回車。
樣例
輸入#george
+rodney
#arthur
+gareth
+walter
#gareth
+edward
?edward
?walter
?rodney
?arthur$輸出
edward arthur
walter arthur
rodney george
arthur arthur
題目分析
找自己的祖先->明顯的並查集,但是又有所不同,因為我們平時學的並查集元素們都是以數字的形式出現,本題目的父親,子代,祖先都是字串,那我們就想到了用mapmp(其中a1是陣列下標型別,a2是陣列內容型別) 比如在這個題目中我們可以mapmp(eg.mp[edward]=arthur;)
之後的做法和普通並查集是一樣的
#include
using
namespace std;
mapmp;
//map陣列用來記錄string1的祖先string2是誰
char s1;
string s2,sfa;
int i,j,n,m,l,k;
string find
(string n)
intmain()
else
if(s1==
'+')
mp[s2]
=find
(sfa)
;/*find(sfa)保險起見,
我們找的是祖先的爸爸
而不是直接讓mp[s2]=sfa;
*/else
if(s1==
'?')
cout<" "<<
find
(mp[s2]
)<}}
家譜 map容器與並查集
本題思路參考自洛谷博主zhm iancai。建立map容器 mapp 其模板為 mapvarname 此處建立的是字串對應字串的詞典。查詢操作 string findf string x while cin tmp else if tmp else 1 建立父親 if tmp 如果s1位置上沒有鍵值...
家譜(並查集)
problem description 現代的人對於本家族血統越來越感興趣,現在給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。input 輸入有多組資料,每組資料由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係由二行組成,用 name的形式描寫一組父子關係中的父親的名字,用 ...
家譜 並查集
description 現代的人對於本家族血統越來越感興趣,現在給出充足的父子關係,請你編寫程式找到 某個人的最早的祖先。input 輸入檔案由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係由二行 組成,用 name 的形式描寫一組父子關係中的父親的名字,用 name 的形式描寫一組父...