自己研究的扯淡演算法,不知道有沒有重複的
[演算法定義及適用範圍]
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 ...