發表文章

目前顯示的是有「Kruskal」標籤的文章

[TIOJ] 1445. 機器人組裝大賽

題目連結: http://tioj.infor.org/problems/1445 不難發現本題就是是一題裸次小生成樹題,那次小生成樹該怎麼寫呢?先求一棵最小生成樹後,枚舉所有不在最小生成樹上的邊,把它塞到最小生成樹上,此時必定會產生一個環,而把在環上且在最小生成樹上的最大邊拔掉後就得到了另一個生成樹,不難證明枚舉完這些樹後得到的答案就會是次小生成樹。不過要怎麼有效率的求一個路徑上的最大值呢?不難想到可以樹練剖分,不過礙於記憶體限制,我不太確定會不會MLE。不過想想後如果你是用倍增法求LCA的話,在跑上去的過程中似乎就可以順便算最大值,所以就先求LCA後,再對兩個點倍增到LCA,並同時算最大值就可以解決這問題了。複雜度:$O(E log E)$ #include <bits/stdc++.h> using namespace std; #define endl '\n' #define PB push_back typedef long long lld; typedef pair<lld,lld> pll; #define N 1000 #define logN 15 #define INF 2147483647777 struct Edge{ int s,e; lld v; }; int djs[N+5]; inline int Query(int); inline void Merge(int,int); vector<Edge> Tree; vector<pll> MST[N+5]; pll ff[N+5][logN+5]; int timer=0,time_in[N+5],time_out[N+5]; void dfs(lld,lld,lld); inline bool anc(int,int); inline int lca(int,int); inline lld walk(int,int); int main(){ cin.tie(0);io...