NOI 2018 歸程 Kruskal重構樹

2021-08-26 20:23:22 字數 1271 閱讀 3483

題目大意:太長了,略

kruskal重構樹,很神奇的乙個演算法吧

如果兩個並查集被某種條件合併,那麼這個條件作為乙個新的節點連線兩個並查集

那麼在接下來的提問中,如果某個點合法,它的所有子節點也都合法,即子節點的限制少於父節點

#include #include #include #include #define inf 0x3f3f3f3f

#define ll long long

#define il inline

#define n 400100

#define m 800100

using namespace std;

//re

int t,cte,ctb,n,m,tot;

int head[n],hbt[m],fa[m],ff[m][21],dis[n],use[n],mi[m],hei[m];

struct edgeedge[m];

struct krskrs[n];

struct btbt[m*2];

struct node;

int cmpk(krs s1,krs s2)

il node ins(int x1,int x2)

bool operator<(const node &s1,const node &s2)

int find_fa(int x)

return fx;

}int gc()

while(p>='0'&&p<='9')

return rett*fh;

}void clr()

void abt(int u,int v)

void ae(int u,int v,int w)

void dfs_bt(int x)

}void get_multip()

int multi(int x,int p)return x;

}void dijkstra()}}

}void kruskal()

hei[0]=-1;

dfs_bt(tot);

get_multip();

}int solve(int x,int p)

int main()

dijkstra();

kruskal();

int q,k,s;

q=gc(),k=gc(),s=gc();

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

}return 0;

}

NOI2018 歸程 題解

容易發現,當水位線確定了,圖會被分成若干個連通塊,連通塊裡的點可以互相到達,故連通塊內點的答案為其中的點到 1 的距離的最小值,這個可以先 dijkstra 預處理求出 spfa 死了 那考慮怎麼維護連通塊。可持久化並查集?感覺不好搞,有一種神奇的演算法 kruscal 重構樹。其實就是 krusc...

NOI2018 歸程(kruskal重構樹)

思路 每天的最短距離相當於每天走高於海拔高於水位線的路所能到達的所有點中到1的最短距離。現在要想辦法能夠直接查詢這個最短距離,如果能根據海拔構造一種樹狀結構,那麼每次能開車到達的點對應一顆子樹,那麼只需要倍增出這顆子樹的根節點就可以了。kruskal重構樹 對海拔從大到小排序,然後跑kruskal,...

NOI2018 歸程 kruskal重構樹

lg傳送門 kruskal重構樹模板題。另一篇文章裡有關於kruskal重構樹更詳細的介紹和更板子的題目。題意懶得說了,這題的關鍵在於快速找出從查詢的點出發能到達的點 即經過海拔高於水位線的邊能到達的點 中距離 1 號點最近的距離。看上去可以kruskal,假設我們把邊實現按海拔從大到小排序,考慮我...