JZOJ 3806 小X 的道路修建

2021-07-25 20:52:55 字數 1276 閱讀 4719

因為一場不小的**,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個數互不相同,所以沒有重複 相當於是...