克魯斯卡爾Kruskal

2022-05-25 08:12:10 字數 1228 閱讀 8926

在b 國裡,有n 個城市,每個城市有乙個發達程度a[i]。b 要修建一些道路,修建這條道路的花費為cost[i],把這些城市連起來,使得任意2 個城市之間,有且只有1 條路相聯通。最後這些道路建成時,每個城市對b 國的經濟會做出貢獻,貢獻度為a[i] *(i 這個城市它所直接相連的城市數)(但由於b 國的人民只熱衷於fq,所以經濟並不發達,這個貢獻值會遠遠小於cost)。這樣b 就得出了乙個對這個方案的代價,為總cost-總貢獻值,現在b 要求一種方案使得這個代價最小。

第一行兩個數n,m,表示城市數量,可以修建的道路條數m。

接下來1 行n 個數,表示a[i]。

接下來m 行,每行3 個數,x,y,z,表示一條從x 到y 的雙向邊,修這條路

的代價為z。

乙個數表示最小代價。

3 3

1 2 3

1 2 21

1 3 21

2 3 22

34

思路:把代價看作 每條邊-這條邊連線城市的價值,這樣就可以跑最小生成樹了~

1 #include 2 #include 3 #include 4

#define maxx 100010

5#define ll long long

6using

namespace

std;

7struct

edgee[maxx];

10int

a[maxx];

11int

father[maxx];

12int

n,m,x,y,v,cnt,blockcnt;

13ll ans;

14bool

cmp(edge a,edge b)

17int find(int x)25}

26return

s;27}28

void connect(int u,int

v)35

else

39return;40

}41intmain()

47for(int i=1;i<=m;i++)

53 sort(e+1,e+1+m,cmp);

54for(int i=1;i<=n;i++)

57for(int i=1;i<=m;i++)65}

66 printf("

%lld\n

",ans);

67return0;

68 }

Kruskal(克魯斯卡爾)

kruskal演算法 一 之 c語言詳解 prim 在稠密圖中比 kruskal 優,在稀疏圖中比 kruskal 劣。kruskal 時間複雜度由排序演算法決定,若採用快排則時間複雜度為o n logn networking include include include include incl...

kruskal克魯斯卡爾演算法

給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用 邊集陣列 且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間 方法 將圖中邊按其權值由小到大的次序順序選取,...

克魯斯卡爾演算法 Kruskal

克魯斯卡爾 kruskal 演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g v,e 是乙個具有 n 個頂點的帶權連通圖,t u,t e 是g 的最小生成樹,則構造最小生成樹的步驟如下 1 設定 u的初值等於 v 即包含有 g中的全部頂點 te 的初值為空集 即圖 t 中每乙個...