洛谷題解 P2814 家譜

2021-10-09 21:42:00 字數 1656 閱讀 3042

洛谷,

myoj,

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

輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用#name的形式描寫一組父子關係中的父親的名字,用+name的形式描寫一組父子關係中的兒子的名字;接下來用?name的形式表示要求該人的最早的祖先;最後用單獨的乙個$表示檔案結束。

按照輸入檔案的要求順序,求出每乙個要找祖先的人的祖先,格式為:本人的名字 + 乙個空格 + 祖先的名字 + 回車。

#george

+rodney

#arthur

+gareth

+walter

#gareth

+edward

?edward

?walter

?rodney

?arthur

$

edward arthur

walter arthur

rodney george

arthur arthur

規定每個人的名字都有且只有 6 個字元,而且首字母大寫,且沒有任意兩個人的名字相同。最多可能有 10^3 組父子關係,總人數最多可能達到 5×10^4 人,家譜中的記載不超過 30 代。

題意還是比較清晰的,不需要分析了。

看完後,就知道考察並查集的知識點。和其他並查集不同的地方,這裡的資料類似都是字串,而不是數字。

還是套用並查集的模板。由於考慮到資料都是字串,所以直接使用 map來儲存並查集是最簡單的。

根據樣例資料,我們可以寫出這樣的集合關係。

ds["arthur"]="arthur";

ds["edward"]="arthur";

ds["gareth"]="arthur";

ds["george"]="george";

ds["rodney"]="george";

ds["walter"]="arthur";

下面我們根據 ds 來查詢就可以得到答案。

由於使用 map來儲存並查集,所以程式一開始的時候,沒有辦法進行初始化。我們需要在合適的地方對 ds 陣列進行初始化。

我們可以在讀入名字的時候,查詢一下名字的父節點,如果父節點為空,說明沒有初始化過,應該進行初始化。如果父節點不為空,說明已經初始化了。

本題資料讀入屬於不知道長度型別,套用對應的模板**即可。

//

//p2814 家譜

#include using namespace std;

const int maxn=5e4+4;

mapds;

string find_root(string x)

void union_set(string x, string y)

int main()

cin>>s;

//初始化

if (""==find_root(s))

if ('?'==ch) else if ('#'==ch) else if ('+'==ch)

}return 0;

}

洛谷P2814 家譜

查詢祖先的題目,自然是要用到並查集了,不過在輸入,資料的處理上要注意細節,名字的前面 等字元顯然是分類的,可以先輸入乙個字元,然後判斷後分別處理。還有map關聯兩個字串就可以了,不用再進行編號 字元的轉換,並查集時一定要注意祖先的初始化。include include include include...

洛谷P2814 家譜

現代的人對於本家族血統越來越感興趣。給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。輸入格式 輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用 name的形式描寫一組父子關係中的父親的名字,用 name的形式描寫一組父子關係中的兒子的名字...

洛谷P2814 家譜

洛谷 p2814 家譜 水的典型的並查集題目,但在建立關係時需要有一定的思考,因為名字都是字串,所以這裡採用了map以建立名字和名字之間的關係 include include include include include using namespace std map persons string...