題目鏈結
乙個嚴格次小生成樹的模板題。
看到次小生成樹,我們有乙個很直觀的想法就是先構造出來最小生成樹,然後將這個最小生成樹上面最大的一條邊替換成和它值最相近而且比他大的邊。
那麼首先就是用kruskal演算法算出來最小生成樹,我們稱在這個最小生成樹上面的邊為樹邊(打上標記),不在的邊為非樹邊。
之後就是用非樹邊替換樹邊了。
考慮怎麼替換。我們可以通過列舉每一條非樹邊,然後找到這條邊對應的兩端節點在最小生成樹上的最大邊權,然後替換。
正確性顯然,因為非樹邊肯定比樹邊劣,而當我們替換了樹邊之後,肯定是次小的。
但是要注意一點就是這個題是嚴格次小的,所以我們在記錄最大值的時候還要記錄次大值。
然後就是如何找最小生成樹上兩個點之間的邊權最大值和次大值。觀察資料範圍,3e5的資料顯然不能乙個乙個暴力,那麼就是倍增或者樹剖優化了。
在這裡給出倍增的做法,**如下:
#include#include#include#include#include#define maxn 300010
using namespace std;
int n,m,t;
long long res=(long long)1e15,sum;
int head[maxn],dis[maxn],fa[maxn],g[maxn][32],done[maxn],dep[maxn],maxx1[maxn][32],maxx2[maxn][32];
struct edgeedge[maxn<<1],pre[maxn<<1];
inline int find(int x)
inline bool cmp(struct edge x,struct edge y)
int main()
printf("%lld\n",sum+res);
return 0;
}
BJOI2011 嚴格次小生成樹
問題描述 小c最近學了很多最小生成樹的演算法,prim演算法 kurskal演算法 消圈演算法等等。正當小c洋洋得意之時,小p又來潑小c冷水了。小p說,讓小c求出乙個無向圖的次小生成樹,而且這個次小生成樹還得是嚴格次小的,也就是說 如果最小生成樹選擇的邊集是em,嚴格次小生成樹選擇的邊集是es,那麼...
嚴格次小生成樹 BJWC2010
原文必點 原題鏈結 給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。設最小生成樹的邊權之和為 sum 嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。輸入格式 第一行包含兩個整數 n 和 m 接下來 m 行,每行包含三個整數 x,y,z 表示點 x 和點 y 之前存在...
BJWC2010 嚴格次小生成樹
板子題 先kruskal得到最小生成樹,再列舉未加進生成樹中的邊i,該邊i和生成樹樹形成了乙個環,選擇這個環上最大的不等於i的權值的邊去掉就得到乙個新的樹,所有這樣得到的樹權值之和即為次小生成樹。求環上最大邊可以用倍增或者樹鏈剖分,由於最大邊可能和才加上去的邊相等,所以還要維護乙個次大邊 inclu...