最優生成樹 並查集和貪心的運用

2021-07-14 19:26:31 字數 1310 閱讀 8163

【問題描述】

給出n個頂點、e條邊的連通無向簡單圖,請你完成下列任務:

任務1、求邊權和最小的生成樹(最小生成樹)

任務2、求邊權和最大的生成樹(最大生成樹)

任務3、求最大邊最小的生成樹(瓶頸生成樹)

任務4、求最小邊最大的生成樹(瓶頸生成樹)

【輸入格式】

第一行:兩個整數n,e(n<=50000,e<=100000),分別表示有n個新島,e對能直接用電纜連線的島嶼,其中主島為1。

接下來m行:每行三個數u,v,w,1<=u,v<=n,表示島嶼u和v之間可以直接用電纜連線,距離為w(<=100000)。

【輸出格式】

第一行乙個整數,表示最小生成樹的邊權和;

第二行乙個整數,表示最大生成樹的邊權和;

第三行乙個整數,表示最大邊最小的生成樹中,最大邊的權值;

第四行乙個整數,表示最小邊最大的生成樹中,最小邊的權值;

【輸入樣例】

5 8

1 2 2

1 3 12

1 4 10

2 3 8

2 5 9

3 4 6

3 5 3

4 5 7

【輸出樣例】

19 39 8 8

【資料範圍】

n<=50000,e<=100000

用並查集的方法,用貪心的思想從一頭開始加邊。

詳見**解釋:

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50005;

struct shu

;vector

g;int n,m,fa[maxn];

bool my(shu a,shu b)

); }

sort(g.begin(),g.end(),my);

}void in()

int find(int x)

int main()

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

t=n-1;

ans=0;

int p;

in();

for(int i=g.size()-1;i>=0;i--)

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

return

0;}

Kruskal演算法(貪心 並查集 最小生成樹)

kruskal演算法 克魯斯卡爾 演算法 的高效實現需要一種稱作並查集的結構。我們在這裡不介紹並查集,只介紹kruskal演算法的基本思想和證明,實現留在以後討論。kruskal演算法的過程 1 將全部邊按照權值由小到大排序。2 按順序 邊權由小到大的順序 考慮每條邊,只要這條邊和我們已經選擇的邊不...

Kruskal演算法(貪心 並查集 最小生成樹)

2016年04月16日 17 34 35 kruskal演算法的高效實現需要一種稱作並查集的結構。我們在這裡不介紹並查集,只介紹kruskal演算法的基本思想和證明,實現留在以後討論。kruskal演算法的過程 1 將全部邊按照權值由小到大排序。2 按順序 邊權由小到大的順序 考慮每條邊,只要這條邊...

並查集 最小(最大)生成樹

首先給出並查集基本 int fa maxn rank maxn 基礎陣列,fa陣列儲存上乙個節點,rank表示節點級數 比較少用 初始化 void init int n 查詢 int find int x void combine int a,int b 判斷 bool issame int a,i...