題目大意:中文題。
思路:其實就是求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 是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。本文先介...