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 已經走到過就不需要再走了,問最後的行走距離 ...