簡單高效的最近公共祖先問題c 實現

2021-07-13 05:49:17 字數 812 閱讀 1386

題目連線

#include "stdafx.h"

#include

#include

#include

#include

using

namespace

std;

//這個的含義是,建立乙個雜湊表,鍵值是兒子

//值為父親,即將父親和兒子的對映關鍵建立

//注意乙個父親可以有多個孩子,因此將兒子作為鍵值,是一一對應的關係

map sf;//son,father

map vis;//判斷是否已經訪問

int n, m;

//要查詢的兩個孩子

void find(string a, string b) //即完成了尋找這個孩子的所有祖先的問題

tmp = b;//將b孩子給temp,注意多了乙個條件

while (!tmp.empty() && !vis[tmp]) //即只需要找到未標記到的即可

tmp = sf[tmp];//因為,如果已標記了的話,則一定是兩個孩子的最近公共祖先

if (!tmp.empty())//如果不空的話,則輸出這個祖先

cout

<< tmp << endl;

else

cout

<< -1

<< endl;

}//測試

int main()

scanf("%d", &m);

while (m--)

return

0;}

最近公共祖先問題

最近公共祖先 least common ancestors 問題是面試中經常出現的乙個問題,這種問題變種很多,解法也很多。最近公共祖先問題的定義如下 對於有根樹t的兩個結點u v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u v的祖先且x的深度盡可能大。另一種理解方式是把t理解為乙個無...

最近公共祖先問題

在樹中尋找兩個結點的最近公共祖先 從樹的根節點開始進行深度優先搜尋,每次經過某乙個點 無論是從它的父親節點進入這個點,還是從它的兒子節點返回這個點,都按順序記錄下來。這樣就把一棵樹轉換成了乙個陣列。而找到樹上兩個節點的最近公共祖先,無非就是找到這兩個節點最後一次出現在陣列中的位置所囊括的一段區間中深...

最近公共祖先問題(LCA)

最近公共祖先問題 lca 下面的內容來自演算法藝術與資訊學競賽一書 lca問題 給出乙個有根樹t,對於任意兩個節點u和v,求出 lca t,u,v 即離根最遠的結點x,使得x同時是u和v的祖先。從上面的遞推方法,給我們乙個啟示。當l u l v 時,可以根據lca u,v 的答案把所有結點分成若干個...