Factory(LCA的離線演算法)

2021-08-15 01:22:41 字數 1189 閱讀 1051

題目大意:中文題。

思路:其實就是求lca的離線演算法的模板,只不過多了幾步。

因為圖是城市與城市之間的圖,而詢問的是公司與公司之間的最短距離。

所以要在建立兩個關係,他給你了每個公司在哪個城市有分公司,所以乙個是分公司與城市,乙個是城市與分公司。lca查詢的是後從城市到公司,公司到詢問的另乙個公司,另乙個公司到相應的分公司,遍歷所有的情況即可。

**:

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

const

int maxn=1e5+9;

int first1[maxn],first2[maxn],first3[maxn],first4[maxn],vis[maxn],fath[maxn],ans[maxn],dis[maxn];

//陣列的功能在下面介紹,鄰接表比較多,別搞混了。

int n,m;

struct node//記錄城市與城市的關係

edge[maxn*10];

struct nodee//記錄分公司與城市的關係

edgee[maxn*10];

void build_edge(int u,int v,int w,int firs)

; firs[u]=n++;

edge[n]=(node);

firs[v]=n++;

}void build(int u,int v,int firs)

; firs[u]=m++;

}void init()//初始化

int find(int x)//查詢公共祖先

void trajan(int u)}}

}for(int i=first1[u];i!=-1;i=edge[i].nex)

}}int main()

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

}scanf("%d",&q);

for(int i=1;i<=q;i++)

dis[1]=0;

trajan(1);

for(int i=1;i<=q;i++)

printf("%d\n",ans[i]);

}return

0;}

LCA的離線演算法

lca least common ancestor 顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。tarjan作...

LCA的離線演算法Tarjan

總的來說是深度遍歷。以根為節點建立並查集。比如說求p,v的lca。當訪問到p的時候檢查v是否已經訪問過。如果訪問過,那麼他們的lca就是v現在所在的並查集裡面的元素。如果沒有訪問到。那麼等到v訪問到的時候可以操作一下。充分利用了遞迴這個操作,所以不必要儲存以前的東西,自然而然的就將u裡面的所有的子節...

LCA離線演算法tarjan

lca演算法 lca least common ancestor 是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。本文先介...