最小生成樹

2021-10-09 02:14:55 字數 3389 閱讀 4419

最小生成樹

description

在一張圖上有n個點,點與點之間的連線的花費都已經告訴你了,請你設計一下,如何解決這個「最小生成樹」的問題。要求用prim方法求解。

input

首先輸入乙個數字n(0〈=n〈=100)

然後輸入乙個n*n的矩陣 其中第i行第j列的數字k表示從點i到點j需要的花費。

output

乙個數字,最少需要多少花費才能使得整張圖任意兩點都直接或者間接連通(也就是最小生成樹的權)

sample input

50 41 67 34 0

41 0 69 24 78

67 69 0 58 62

34 24 58 0 64

0 78 62 64 0

20 1

1 0sample output

1160

1

#include

using

namespace std;

struct jg

;#define inf 999999999

int g[

101]

[101];

bool bj1[

101]

,bj2[

101]

;jg nsj

(int xn)

;int

main()

else

} ans=0;

c=1;

bj1[1]

=true

; bj2[1]

=false

;while

(ccout

}jg nsj

(int xn)}}

}}return nsjj;

}

最小生成樹(要求用kruskal演算法寫)

description

在一張圖上有n個點,點與點之間的連線的花費都已經告訴你了,請你設計一下,如果解決這個「最小生成樹」的問題。

input

首先輸入乙個數字n(0〈=n〈=100)

然後輸入乙個n*n的矩陣 其中第i行第j列的數字k表示從點i到點j需要的花費。

output

乙個數字,最少需要多少花費才能使得整張圖任意兩點都直接或者間接連通(也就是最小生成樹的權)

sample input

50 41 67 34 0

41 0 69 24 78

67 69 0 58 62

34 24 58 0 64

0 78 62 64 0

20 1

1 0sample output

1160

1

#include

using

namespace std;

struct jg

;jg a[

5003];

int zz[

101]

;int n,e;

void

merge

(int r,

int t)

;boolbj(

const jg &u,

const jg &v)

;int

main()

e=0;

for(i=

1;i<=n;i++)}

}sort

(a+1

,a+e+

1,bj)

; ans=0;

k=n;

alg=1;

while

(k>1)

alg++;}

cout<}return0;

}void

merge

(int r,

int t)}}

boolbj(

const jg &u,

const jg &v)

不同條件下的最小生成樹

description

課堂上我們學習了最小生成樹的演算法思想,也在實驗課自己動手實現了這個演算法,今天我們仍然要求來實現這個演算法,只不過輸入要求不一樣,而且給定的圖也不是所有頂點之間都有連線的邊,有些頂點之間沒有邊,要求計算的最小費用也有點變化,請準確理解並求解.

input

輸入的第一行是測試資料的組數,對於每一組測試資料,有兩部分,第一部分只有一行,分別有兩個正整數nnode、nedge(分別表示圖的頂點數、邊數,其中頂點編號為1到nnode,1<=nnode<=100);第二部分共有nedge行,每行有四個正整數nfrom、nto、ndist、nv(分別表示這一條邊的起始頂點、終止頂點、邊的長度、這條邊上能夠承載的速度,當然它們的單位已經換算成相應的標準單位了,你不用考慮單位換算的問題;其中1<=nfrom,nto<=nnode)。輸入資料保證能夠有生成樹,每條邊在計算費用時假設是各自的勻速運動。

output

你的任務是以每條邊上能承載的速度前提下將所需時間作為邊的費用,求出最小生成樹的花費,輸出只有一行,即所求的花費,輸出時保留一位小數。

sample input

16 10

1 2 6 3

1 3 1 1

1 4 5 2

2 3 5 3

2 5 3 2

3 4 5 3

3 5 6 3

3 6 4 2

4 6 2 1

5 6 6 3

sample output

7.8

#include

using

namespace std;

struct jg

;jg a[

5003];

int zz[

101]

;int n,e;

void

merge

(int r,

int t)

;boolbj(

const jg &u,

const jg &x)

;int

main()

for(i=

1;i<=e;i++

)sort

(a+1

,a+e+

1,bj)

; ans=

0.0;

k=n;

alg=1;

while

(k>1)

alg++;}

printf

("%.1lf\n"

,ans);}

return0;

}void

merge

(int r,

int t)}}

boolbj(

const jg &u,

const jg &x)

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...