最小生成樹演算法

2021-07-04 01:55:10 字數 1155 閱讀 1079

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹(minimum spanning tree),簡稱為mst

構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱為kruskal演算法

prim演算法中,每次迴圈選擇乙個頂點(和一條邊)加入到最小生成樹中,直到所有頂點全部在最小生成樹中為止。與prim演算法不同,kruskal演算法在一開始就把所有頂點都放到最小生成樹中,每次迴圈只根據mst性質,選擇一條適當的邊加到最小生成樹,直到沒有合適的邊為止。

prim演算法

#define inf 0x3f3f3f3f

#define max 10010

int cost[max][max]; //儲存圖

int prim(int n)

if(minc == inf)return -1; //圖不連通

ans += minc;

vis[p] = 1;

for(int j=0; jif(!vis[j] && lowc[j]>cost[p][j])

lowc[j] = cost[p][j];

} for(int i=0; icout

<" ";

cout

}

kruskal演算法
#define maxn 10010      //最大點數

#define maxm 1000010 //最大邊數

int f[maxm]; //並查集陣列

struct edgeedge[maxn];

bool cmp(edge x, edge y)

int find(int x)

int kruskal(int n,int m)

if(cnt == n-1)

break;

} if(cnt != n-1)

return -1; //不連通

return ans;

}

最小生成樹演算法

乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...

演算法 最小生成樹

前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...

最小生成樹演算法

假設 n 表示圖中點數,m表示圖中邊數。適用於稠密圖,時間複雜度 o n2 核心思想 每次挑一條與當前集合相連的最短邊。c st i 表示點i是否在當前生成樹集合中 dist i 表示點i到當前集合的最短邊的長度 g i j 表示點i和點j之間邊的長度 返回值 最小生成樹中所有邊的總長度 intpr...