1062 最近公共祖先 一

2021-07-03 22:24:56 字數 2210 閱讀 7903

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb 描述

小ho最近發現了乙個神奇的**!雖然還不夠像58同城那樣神奇,但這個**仍然讓小ho樂在其中,但這是為什麼呢?

「為什麼呢?」小hi如是問道,在他的觀察中小ho已經沉迷這個**一周之久了,甚至連他心愛的樹玩具都棄置一邊。

「嘿嘿,小hi,你快過來看!」小ho招呼道。

「你看,在這個對話方塊裡輸入我的名字,在另乙個對話方塊裡,輸入你的名字,再點這個查詢按鈕,就可以查出來……什麼!我們居然有同乙個祖祖祖祖祖爺爺?」

「誒,真是誒……這個**有點厲害啊。」小hi不由感嘆道。

「是啊,這是什麼演算法啊,這麼厲害!」小ho也附和道。

「別2,我說的是他能弄到這些資料很厲害,而人類的繁殖樹這種層數比較淺的樹對這類演算法的要求可是簡單的不得了,你都能寫出來呢!」小hi道。

「啊?我也能寫出來?可是……該從哪開始呢?」小ho困惑了。

小ho要面臨的問題是這樣的,假設現在他知道了n個人的資訊——他們的父親是誰,他需要對於小hi的每一次提問——兩個人的名字,告訴小hi這兩個人的是否存在同乙個祖先,如果存在,那麼他們的所有共同祖先中輩分最低的乙個是誰?

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

每組測試資料的第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

題解:這道題我是先將每乙個名字與乙個不同的數字匹配,用map解決,然後用遞迴將第乙個的祖先(包括自己)與另外乙個的比較,存在返回匹配的數字,否則返回-1。

#include #include #include #include #include #include #include using namespace std;

int pre[202];

bool visited[202];

mapmp;

int cnt;

int solve(string& s)

else }

int find1(int x1,int x2)

if(x2 == pre[x2])

return find1(x1,pre[x2]);

}int find(int x1,int x2)

int t = find1(x1,x2);

if(-1 == t)

else }

string output(int x) }

}int main()

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

cin>>m;

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

else

{ //printf("%s\n",output(res).c_str());

cout<

hihoCoder 1062 最近公共祖先 一

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 小ho最近發現了乙個神奇的 雖然還不夠像58同城那樣神奇,但這個 仍然讓小ho樂在其中,但這是為什麼呢?為什麼呢?小hi如是問道,在他的觀察中小ho已經沉迷這個 一周之久了,甚至連他心愛的樹玩具都棄置一邊。嘿嘿,小hi,...

hiho 1062 最近公共祖先

題目大意 給出一棵家譜樹,樹中的節點都有乙個名字,保證每個名字都是唯一的,然後進行若干次查詢,找出兩個名字的最近公共祖先。分析 實現 include include include include include include includeusing namespace std unordere...

hiho 1062 最近公共祖先

題目大意 給出一棵家譜樹,樹中的節點都有乙個名字,保證每個名字都是唯一的,然後進行若干次查詢,找出兩個名字的最近公共祖先。分析 實現 include include include include include include includeusing namespace std unordere...