最近公共祖先

2021-09-10 13:17:49 字數 2142 閱讀 6815

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

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

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

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

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

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

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

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

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

「但是……你不是說我能夠寫出來的麼?」小ho納悶了。

「所以說我們慢慢來不要急,先教你個最簡單的法子。」小hi如是說道。

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

小hi點了點頭道:「差不多就是這樣!當然你也先將乙個人的祖先全都標記出來,然後順著另乙個的父親一直向上找,直到找到第乙個被標記過的結點,便是它們的最近公共祖先結點了。」

「原來這麼簡單!」小ho笑道:「那我先去寫著了。」

close      

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

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

sample input

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

sample output

jiadaishan

jiazheng

-1

這道題的關鍵是是使用了乙個map,建立起名字與名字之間的關係,形成一棵樹。

以下**:

#include #include #include using namespace std;

int main()

int m;

cin>>m;

while(m--)

isvalid[c1]=1;

int flag=1;

doc2=pach[c2];

}while(pach.find(c2)!=pach.end()&&flag);

if(flag) cout<<-1<}

}

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...

最近公共祖先 最近公共祖先(LCA)

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b,表示詢問...