最小生成樹

2021-08-28 08:58:43 字數 1217 閱讀 6267

擴充套件:最小生成樹

最小生成樹的概念:在一副加權連通圖中,最小生成樹包含原圖中的所有 n 個結點且權值和最小,並且有保持圖連通的最少的邊(說的就是不會成環)。

解決最小生成樹的演算法:prime和kruskal演算法

prime演算法: 先任意選擇一條邊(一般直接選擇第一條),連線與其相連權值最小的點,然後兩個點成為乙個集合體。 找這個不在這個集合體裡 但是與集合體相連的權值最小的點 與集合體相連,並把該點歸入集合體。 重複上一條操作,直到集合體歸入了所有的點

kruskal演算法: 先選擇一條權值最小的邊,把這條邊相連的兩個點歸成乙個集合。 再找下乙個權值最小的邊,但是邊相連的兩個點不能屬於同乙個集合,把這條邊相連的兩個點(這裡也可以是集合)歸成乙個集合 重複上一條操作,直到最後只有乙個集合體且歸入所有的點。

兩個的區別:

集合的個數:

prime演算法自始自終只有乙個集合,而kruskal演算法可以有多個集合,所以kruskal演算法要用到並查集。

選取的方式:prime演算法先是任意選取,再根據選取已有的基礎上選取權值最小且不在集合的點(取點)。kruskal演算法則是每次以權值最小的邊來選取,可以有多個集合(取邊)

kruskal演算法:

#include#includeusing namespace std;

#define inf 3000

struct edge //邊的結構體

p[10000+5]; //邊的集合,等會用於排序

int parent[100+5]; //並查集,將每個聯通分量都用最上方的根表示

bool com(edge a,edge b)

for(int i = 1; i <= n; i++)//包括第乙個點在內,一共要納入n個點

} vis[v] = true;//把該頂點納入已知集合 ,v就是未納入頂點最短距離的點

for(int j = 0; j < n; j++)//更新與未納入集合中的頂點的邊的最小權值

} int ans;

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

ans += dis[i]; //將每個點(除起點)的距離累加

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

} int main()

/*for(int i=0;i*/

prim();

} 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...