家譜 並查集 map

2021-10-22 14:16:46 字數 1321 閱讀 7905

題目描述

給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。

輸入格式

輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用 #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 的形式描寫一組父...