bzoj3910 火車 lca 並查集

2021-07-11 20:49:23 字數 912 閱讀 1990

a 國有n 個城市,城市之間有一些雙向道路相連,並且城市兩兩之間有唯一

路徑。現在有火車在城市 a,需要經過m 個城市。火車按照以下規則行駛:每次

行駛到還沒有經過的城市中在 m 個城市中最靠前的。現在小 a 想知道火車經過

這m 個城市後所經過的道路數量。 

第一行三個整數 n、m、a,表示城市數量、需要經過的城市數量,火車開始

時所在位置。 

接下來 n-1 行,每行兩個整數 x和y,表示 x 和y之間有一條雙向道路。 

接下來一行 m 個整數,表示需要經過的城市。 

一行乙個整數,表示火車經過的道路數量。 

5 4 2

1 2

2 3

3 4

4 5

4 3 1 5

9 n<=500000 ,m<=400000 

題解:用並查集來維護點與點之間的聯通關係。

初始時不需要經過的點在並查集中指向它的父親。

需要經過的點指向它自己。

每處理完一次旅行把所有經過的點都縮起來即可。

具體就是把其中需要經過的點指向它的父親。

**:#include#include#include#define n 500010

using namespace std;

int m,now,deep[n],point[n],next[n<<1],cnt,ff,f[n],fa[n][20],n,a[n],x,y;

long long ans;

struct usee[n<<1];

bool vis[n];

void add(int x,int y)

int find(int x)

void dfs(int x)

void up(int x){

if (deep[x]

題解 BZOJ 3910 火車

3910.火車 給你一棵樹,給你乙個訪問節點的序列,按照先後順序去訪問序列中的從未經過過的節點,問經過了多少條邊。並查集 lca 用並查集維護每個點是否走過,如果走過了就將該點和他的第乙個沒被走過的父親合併。lca 用來計算距離,在路徑上暴跳的時候維護並查集,因為每個點最多被經過一次,複雜度 o n...

3910 火車 LCA 並查集

在樹上走顯然是求lca,然後每次走完把端點到lca路徑上的點都用並查集合並,之後如果判斷兩點所屬集合相等說明已經走過。倍增被鏈剖虐成狗系列 include include define n 500005 define ll long long using namespace std int n,m,...

BZOJ P3910 火車 LCA 並查集

我也不知道為什麼要寫這篇題解 明明十分休閒 糾結了好幾分鐘要不要敘述一下題意 給定一棵樹以及乙個序列,按照序列的順序行走 從loc i loc i loc i 走到l oc i 1 loc i 1 loc i 1 但是如果對於某乙個loc loclo c 已經走到過就不需要再走了,問最後的行走距離 ...