洛谷,
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...