描述 description :
小 s 最近學了最小生成樹,不過聰明的小 s 顯然對簡單的求最小生成樹不感興趣。現在小 s 想知道,對於乙個給定的圖,它的所有生成樹中,最大邊和最小邊的邊權差最小是多少。輸入格式 input format :
第一行,兩個用空格隔開的整數 n 和 m,分別表示頂點數和邊數。輸出格式 output format :下面 m 行,每行 3 個數 u,v,w,表示 u 和 v 之間有一條權值為 w 的無向邊。
一行,乙個非負整數,表示最大邊和最小邊的最小邊權差。若圖本身不聯通,則輸出-1對於本題來講,乙個圖的最小生成樹上的最小邊的權值和最大邊的權值是固定不變的。那麼當使用克魯斯卡爾演算法時,第一次加入的必然是邊權最小的邊,由於克魯斯卡爾演算法的正確性已經得到驗證過,那麼此邊的權值必然就是最小生成樹的最小邊權值了,當最小邊的權值固定時,最小生成樹的最大邊的權值也「命中註定」是固定的,在最小邊權值固定的情況下,其他的生成樹的最大邊必然也是大於等於最小生成樹的最大邊,否則就不滿足我們上文提到的性質,這就是「當生成樹的最小邊確定時,最小生成樹的最大邊的權值是所有生成樹中最小的」。從而,我們得到了乙個本題的解法。 列舉最小邊,然後求最小生成樹,更新最優解
#include
#define maxn 105
#define maxm 10005
#define inf 1000000000
using namespace std;
int n, m;
int fa[maxn]
;struct node
}e[maxm]
;int
find
(int x)
intmain()
}}if(tmp !=-1
&& tmp < ans) ans = tmp;}if
(ans < inf)
printf
("%d\n"
, ans)
;else
printf
("-1\n");
return0;
}
差值最小生成樹 LCT
傳送門 將邊按邊權從小到大排序 如果插入的兩個點在一棵樹上,就找他們路徑上權值最小的那條邊並刪除,然後在新加一條邊 否則直接加就好了 路徑需要以點的形式插入到lct,第i跳路徑對於i n號節點,link x,y 就link x,i n link i n,y 就好了 維護一下最小值 include d...
P4234 最小差值生成樹
題目鏈結 題目描述 給定乙個點標號從 1 11 到 n nn 的 有 m mm 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。圖可能存在自環。輸入格式 第一行有兩個整數,表示圖的點數 n nn 和邊數 mmm。接下來 m mm 行,每行三個整數 u,v w u,v,w u,v,w,表示存在一...
P4234 最小差值生成樹
求最小差值生成樹 考慮先把邊從小到大排序 從大到小也可以,就是反過來而已 然後一條條邊列舉,如果兩端點還未聯通,直接聯通 如果整個圖已經聯通了,此時可以理解為列舉了邊的最大值 因為邊權從小到大排序了 最大值確定,就應該要讓最小值越大越好,又因為要在這兩個端點行成的路徑上刪掉乙個點,那麼就刪掉環上權值...