CSU 2231 最小差異值 克魯斯卡爾演算法

2021-09-20 18:34:59 字數 1284 閱讀 3022

x 省剛經歷一場不小的**,所有城市之間的道路都損壞掉了,所以省長想請你將城市之間的道路重修一遍。

因為很多城市之間的地基都被**破壞導致不能修公路了,所以省長給定了你一些城市對,在這些城市對之間可以修公路,並且都有相應的**。而且因為施工隊伍有限,所以省長要求用盡量少的道路將所有的城市連通起來,這樣施工量就可以盡量少,道路可視為無向邊,且資料保證至少有一種連通的方案。不過,省長為了表示自己的公正無私,要求在滿足上述條件的情況下,選擇一種方案,使得該方案中最貴道路的**和最便宜道路的**的差值盡量小,即使這樣的方案會使總價提公升很多也沒關係。

那麼,請你盡快地安排一種合理的方案,滿足省長的要求。

第一行兩個數 n,m,表示城市的個數以及可以修的公路數;

第二行開始 m 行,每行三個數 a,b,c,表示 a,b 之間可以修一條價值 c 的無向道路。

乙個數表示該方案中最大邊減去最小邊的值,要求要盡量的小。

5 10

1 2 9384

1 3 887

1 4 2778

1 5 6916

2 3 7794

2 4 8336

2 5 5387

3 4 493

3 5 6650

4 5 1422

1686
【樣例說明】 選第 4,5,6,9 條邊即可。

【資料說明】

100%資料滿足 n<=m<=5000,0思路:這題是19年寒假集訓結訓題,當時還是蠢了居然沒有思路。(好像是我看錯了資料範圍覺得m^2lgm過不了)很簡單,暴力跑克魯斯卡爾就行了,當最小邊確定的時候,最大邊也就確定了,(使得圖連通的邊就是最大邊)因此我們列舉最小邊即可。

#include #define inf 0x3f3f3f3f

using namespace std;

struct edge

};edge edge[5005];

int f[5005];

int n,m;

int ans=inf;

void init()

int find(int x)

bool union(int x,int y)

return 0;

}int main()

sort(edge,edge+m);

int cnt=0;

for(int i=0;i}

if(cntbreak;

} printf("%d\n",ans);

return 0;

}

CCF CSP 最小差值

最小差值 試題編號 201712 1 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式...

CCF 最小差值

試題編號 201712 1 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式 輸出乙個...

20171201 最小差值

問題描述 試題編號 201712 1 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式...