因為一場不小的**,y 省n 個城市之間的道路都損壞掉了,省長希望小x 將城市之間的道路重修一遍。
很多城市之間的地基都被**破壞導致不能修路了,因此可供修建的道路只有m 條。因為施工隊伍有限,省長要求用盡量少的道路將所有的城市連通起來,這樣施工量就可以盡量少。不過,省長為了表示自己的公正無私,要求在滿足上述條件的情況下,選擇一種方案,使得該方案中最貴道路的**和最便宜道路的**的差值盡量小,即使這樣的方案會使總價提公升很多也沒關係。
小x 現在手忙腳亂,希望你幫幫他。
2 ≤ n ≤ 2000,0 ≤ m ≤ 15000發現o
(nm)
可以過耶!
先把邊按大小排個序,
對於每條邊,掃一遍全域性,看看有沒有環,有的話把環上最小的邊去掉,
每次判斷一下是不是聯通的,是則更新答案,
複雜度:o(
nm+m
log(m)
)
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define efo(i,q) for(int i=a[q];i;i=b[i][0])
#define min(q,w) ((q)<(w)?(q):(w))
#define max(q,w) ((q)>(w)?(q):(w))
using namespace std;
const int n=2005;
intread(int &n)
int n,m,ans,fd;
struct qqww
b[n*8];
bool z[n*8];
int b[n*16][5],a[n],b0=1;
bool px(qqww q,qqww w)
void link(int
q,int w,int e,int e1)
void dfs(int
q,int fa,int zd,int mi)
efo(i,q)if(b[i][1]!=fa)
}int main()
link(x,y,b[i].v,i);
while(z[mi])mi++;
if(q==n-1)ans=min(ans,b[i].v-b[mi].v);
}if(ans==2e9)printf("-1\n");
else
printf("%d\n",ans);
return
0;}
Jzoj3806 小X 的道路修建
給你乙個圖,求乙個最大邊和最小邊差值最小的生成樹 首先我們可以列舉最小邊,每次跑乙個最小生成樹即可 但是這樣會超時,我們考慮優化 採用最優性剪枝,假設我們當前樹中的最小邊是i,當前邊是j,當前最優答案是ans,那麼對於所有邊k使得length j length k ans的邊在列舉最小邊的時候可以直...
JZOJ5776 小x遊世界樹
description 小x得到了乙個小道訊息,傳說中的神島阿瓦隆在格陵蘭海的某處,據說那裡埋藏著亞瑟王的寶藏,這引起了小x的好奇,但當他想前往阿瓦隆時發現那裡只有聖誕節時才能到達,然而現在已經春天了,不甘心的他將自己的目的地改成了世界樹,他耗費了大量的時間,終於將自己傳送到了世界樹下。世界樹是一棵...
Jzoj3805 小X的二叉堆計數
題意 給你n個不同的數問你能構成多少個不同的二叉堆 顯然不能列舉,我們考慮用遞推 我們令f i 表示以i為根的二叉堆有多少種 令l,r為i的左右兒子,令size i 為以i為根的堆的大小 那麼顯然,f i f l f r c size i 1,size l 因為n個數互不相同,所以沒有重複 相當於是...