輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用#name
的形式描寫一組父子關係中的父親的名字,用+name
的形式描寫一組父子關係中的兒子的名字;接下來用?name
的形式表示要求該人的最早的祖先;最後用單獨的乙個$
表示檔案結束。
按照輸入檔案的要求順序,求出每乙個要找祖先的人的祖先,格式為:本人的名字 ++ 乙個空格 ++ 祖先的名字 ++ 回車。
1 #include 2 #include 3 #include 4 #include 5 #include 67using
namespace
std;89
const
int n = 50010
;10 unordered_mapp;
1112
string find(string
x)13
1718
intmain()
1933
else
if (n == '
+') p[name] =fa;
34else
3539
40while( getchar()!= '\n'
);41}42
43return0;
44 }
31行解釋:由於他已經給出了我們每乙個子節點的父親節點,那麼子節點就不需要進行初始化,只需要對給出的父親節點初始化一下就好。而又因為前面給出的子節點可能為後面的父節點,所以我們需要對第一次出現的父節點初始化一下,而不需要對每乙個父節點初始化,如果對每乙個父節點均進行初始化,那麼父節點的父節點則會被覆蓋掉。
我們在並查集的初始化中是由於每乙個節點都是有可能為父節點,所以要對每乙個節點都初始化。
洛谷P2814 家譜
查詢祖先的題目,自然是要用到並查集了,不過在輸入,資料的處理上要注意細節,名字的前面 等字元顯然是分類的,可以先輸入乙個字元,然後判斷後分別處理。還有map關聯兩個字串就可以了,不用再進行編號 字元的轉換,並查集時一定要注意祖先的初始化。include include include include...
洛谷P2814 家譜
現代的人對於本家族血統越來越感興趣。給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。輸入格式 輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用 name的形式描寫一組父子關係中的父親的名字,用 name的形式描寫一組父子關係中的兒子的名字...
洛谷P2814 家譜
洛谷 p2814 家譜 水的典型的並查集題目,但在建立關係時需要有一定的思考,因為名字都是字串,所以這裡採用了map以建立名字和名字之間的關係 include include include include include using namespace std map persons string...