演算法 LCA最近公共祖先求最短路演算法

2021-08-22 08:32:57 字數 1292 閱讀 7871

自己研究的扯淡演算法,不知道有沒有重複的

[演算法定義及適用範圍]

lca(最近公共祖先)是一種樹上的演算法,求任意兩點a,b的最近公共祖先。一幅n個頂點,n-1條邊的圖就認可以認為這幅圖是一棵樹。

如下圖是一幅n個頂點,n-1條邊的圖,即一棵樹。隨機取出兩個點x,y,找到他們的最近公共祖先,即點1。在尋找最近公共祖先的同時,ans記錄走過的路徑長度。在找到最近公共祖先的時候,找到最短路,演算法結束。

[模擬過程]

如上圖,尋找x,y的最短路,即尋找他們的最近公共祖先

step (1):x往father[x]走一步,達到和y同一層 ans+=1

此時 x在點4,y在點6,ans=1

step (2):x和y同時向各自的父親節點father[x],father[y]走 ans+=2,ans+=5

此時 x在點2,y在點3,ans=8

step(3): x和y同時向各自的父親節點father[x],father[y]走 ans+=3,ans+=6

此時 x在點1,y在點1,ans=17 演算法結束

[演算法實現]

n個點,m條邊,求最短路

int lca(int a,int b)
其中需要預處理的過程

int find(int a)

bool built(int x,int y)

return

false;

}bool cmp(first x,first y)

}

#include 

#include

#include

using

namespace

std;

int n,m;

struct firstinit[2000];

intmap[2000][2000],set[2000],deep[2000];

bool vis[2000];

int find(int a)

bool built(int x,int y)

return

false;

}bool cmp(first x,first y)

}void dfs()

int lca(int a,int b)

int main()

[可拓展的範圍]使用鄰接表儲存,使用倍增優化等

求LCA(最近公共祖先)

演算法1 樹上倍增 hdu 2586 include include include define maxn 40000 5 define inf 999999999 using namespace std int n,m,t,q,head maxn x,y,z,vis maxn fa maxn c...

LCA 求最近公共祖先

洛谷3379 基本思路 要求兩個點的最近公共祖先,首先我們用乙個陣列fa x i 來表示節點x的向上2 i層的祖先編號,先dfs求出每個點的深度和預處理fa陣列。再求兩個節點的最近公共祖先時,先讓深度大的跳到相同的一層,再嘗試以log2 depth x 的跨度跳至祖先節點,相同時不跳 因為可能不是最...

LCA求最近公共祖先

parent i j 表示節點u的第2 j個祖先 dis i dfs時間戳,即節點到根節點距離,即深度 const int pow 18 const int maxn 5e5 10 int parent maxn pow 10 parent i j 表示節點u的第2 j個祖先 vectoredge ...