hihocoder第十三周最近公共祖先

2021-06-28 22:13:45 字數 2145 閱讀 6599

假設現在他知道了n個人的資訊——他們的父親是誰。給出兩個人的名字,找出這兩個人是否存在同乙個祖先,如果存在,那麼他們的所有共同祖先中輩分最低的乙個是誰?

每個測試點(輸入檔案)有且僅有一組測試資料。

每組測試資料的第1行為乙個整數n,意義如前文所述。

每組測試資料的第2~n+1行,每行分別描述一對父子關係,其中第i+1行為兩個由大小寫字母組成的字串father_i, son_i,分別表示父親的名字和兒子的名字。

每組測試資料的第n+2行為乙個整數m,表示小hi總共詢問的次數。

每組測試資料的第n+3~n+m+2行,每行分別描述乙個詢問,其中第n+i+2行為兩個由大小寫字母組成的字串name1_i, name2_i,分別表示小hi詢問中的兩個名字。

對於100%的資料,滿足n<=10^2,m<=10^2, 且資料中所有涉及的人物中不存在兩個名字相同的人(即姓名唯一的確定了乙個人)。

輸出對於每組測試資料,對於每個小hi的詢問,輸出一行,表示查詢的結果:如果根據已知資訊,可以判定詢問中的兩個人存在共同的祖先,則輸出他們的所有共同祖先中輩分最低的乙個人的名字,否則輸出-1。

樣例輸入

11

jiayan jiadaihua

jiadaihua jiafu

jiadaihua jiajing

jiajing jiazhen

jiazhen jiarong

jiayuan jiadaishan

jiadaishan jiashe

jiadaishan jiazheng

jiashe jialian

jiazheng jiazhu

jiazheng jiabaoyu

3jiabaoyu jialian

jiabaoyu jiazheng

jiabaoyu lindaiyu

樣例輸出

jiadaishan

jiazheng

-1

最簡單的法子……如果資料量不大的話,我完全可以直接將這兩個人的祖先全部找出來,然後取它們的交集,然後再找到其中輩分最低的乙個不就行了。

先將乙個人的祖先全都標記出來,然後順著另乙個的父親一直向上找,直到找到第乙個被標記過的結點,便是它們的最近公共祖先結點了。

在程式設計實現時,難以儲存父子關係。參考了十佳**,用vector儲存父子關係,之後用map給這些名字編號,再用vector像並查集那樣儲存父子關係。

最後在查詢兩個名字的最近公共祖先時,再用乙個vector標記。

在實現時注意一點,名字相同的兩個人公共祖先就是這個人,即使這個人沒有出現在輸入中。

#include

#include

#include

#include

int main()

//給每個名字編號

int id=0;

for(std::map

::iterator iter=person.begin(); iter!=person.end(); ++iter)

//像並查集那樣儲存父子關係

std::vector

relationship(person.size(),-1);//沒有祖先結點的設為-1

for(int i=0; i < n; ++i)

int m;

std::cin>>m;

std::string name1,name2;

for(int i = 0; i < m; ++i)

if(person.find(name1)==person.end()||person.find(name2)==person.end())//沒有這兩個名字

std::vector

mark(person.size(),-1);//標記其祖先結點

int name1id=person[name1];

while(name1id!=-1)

int name2id=person[name2];

while(name2id!=-1)

name2id=relationship[name2id];

}if(name2id==-1)

std::cout

<<-1

<}

}

第十三周周小結

2.本週工作任務 幫助各個團隊明確第二次衝刺的目標,制定明天團隊的任務和分工,點評團隊倉庫。我負責的團隊安卓五組,web五組,web八組,web九組 3.作業情況 無 4.本週發現的問題 1 大部分團隊的任務制定的不夠具體,而且有些任務有點偏離了他們在第二次衝刺所指定的目標。2 在第一次團隊衝刺結束...

第十三周總結

呵呵,星期五了,十三周快要結束了,心情真的是不同 因為,從下週開始有幾節課不用上了,而這幾節課都是在4點半到6點半上的,這樣我們就不用為了吃飯而煩惱了 高興還高興,還是要總結這一周的情況 有了乙份新的家教,星期六星期天中午去,中午不睡覺感覺真的不是很好,但無所謂了,為了暑假的生活費,努力一點啦,只是...

第十三周2

檔名稱 完成日期 2014 年 5 月 25 日 版本號 v1.0 對任務及求解方法的描述部分 輸入描述 問題描述 1 先建立乙個point 點 類,包含資料成員x,y 座標點 2 以point為基類,派生出乙個circle 圓 類,增加資料成員 半徑 基類的成員表示圓心 3 編寫上述兩類中的構造 ...