最小生成樹

2021-07-27 15:16:53 字數 1746 閱讀 4570

演算法一:prim演算法(可稱為加點法)

點集記為v。 定義乙個集合u,來儲存已經在生成樹中的點。v-u是未在生成樹中的點。定義乙個closedge陣列,分為兩個區域,乙個儲存最小邊在u中的頂點,另乙個儲存最小邊的權值。將初始頂點加入u中,初始化closedge陣列。選擇最小邊closedge[k],將k加入集合u,輸出此邊。更新closedge的值,選擇集合v-u中點到k和u之間較小的哪個權值存到clodedge陣列中。重複此步驟,直到所有的頂點都加入u中。

用鄰接矩陣儲存圖,用一維陣列儲存現已有的樹到其他定點的最小權值,用另乙個一維陣列儲存某個點是否在生成樹中。

#include#include#include#includeusing namespace std;

#define maxn 110

#define inf 9999999

int maz[maxn][maxn],lowcase[maxn],flag[maxn];

//maz[i][j]表示i到j的距離,注意無向圖和重邊!lowcase陣列存的是現已在樹里的點所能到達的點(maxn)的最小權值

//flag陣列是用來標記某個點(maxn)是否已經在樹裡面

int prim(int n)

}ans += mi;//記錄最小生成樹的總權值

flag[pos] = 1;//將此次尋找的點標記為已經加入生成樹

for (j = 1; j <= n; ++j)//用新的節點更新lowcase陣列}}

return ans;//返回最小生成樹的總權值

}int main()

//剛開始得把陣列裡的數存成無窮大//本身到本身的距離是0//點和點之間的距離是無窮大

int a,b,c;

for (i = 0; i < n*(n-1)/2; ++i)//最大邊數

int ans = prim(n);//n個點的最小生成樹的總長度

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

}return 0;

}

演算法二:克魯斯卡爾(加邊法)

將所有邊的權值排序。

1)初始狀態看為只有頂點沒有邊,每乙個頂點看作乙個連通分量。

2)選擇最小權值的邊,如果該邊連線了不同連通分量,則將該邊加入集合t,否則捨去該邊,繼續尋找下一條權值最小的邊。

3)重複2)直到所有頂點都在同乙個連通分量中。

#include#include#include#includeusing namespace std;

#define maxn 1100

int p[maxn];

int find(int x)

//並查集

struct node

;//每條邊的情況,u,v是邊的端點,w是邊的權值

struct node q[maxn*500]; //定義邊的個數

int cmp(node a,node b)

//sort將邊按權值排序

int main()

sort(q,q+m,cmp);//將邊按照權值排序

sum = num = 0;

for (i = 0; i < m; ++i)//m條邊,從其中選出****n-1條邊,然後跳出迴圈

if (num == n-1) //當足夠了n-1條邊的時候停止

break;

}printf("%d\n",sum); //輸出總權值

}return 0;

}

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...