while迴圈其實不是只迴圈v-1次,因為如果找出的邊能夠形成環的話,這條邊並不是我們需要的邊,所以本次迴圈無效。while迴圈中其實包含了找出最小的功能,這個其實可以通過單獨的乙個函式來實現。就是按邊長度公升序來排列。
kruskal演算法其實是乙個找邊的演算法,對於一v個頂點的圖,必定由v-1條邊構成乙個最小生成樹,那麼按邊的權值遍歷圖每一條邊。判斷如果新增這條選出的當前權最小的邊,圖中會不會生成乙個環,如果生成環,則當前找到的這條邊無效,繼續找下一條權值最小邊。
每找出一條邊,相當於圖中合併了兩個連通部件(初始化是乙個頂點算乙個連通部件),因此找到v-1條邊就相當於是將原來分離的v個連通部件合併成乙個更大的連通部件。
在兩個連通部件之間新增一條邊,會組成乙個更大的連通部件,並且不存在環。
#include#include#include#include #include#includeusing namespace std; #define maxnum 100 //定義鄰接舉證的最大定點數 #define maxweight 1000000 //邊權最大值 int visited[maxnum][maxnum];//用來表示邊visited[i][j]是否被訪問過,初始化都是0 int set[maxnum]; //頂點資訊 typedef struct node; //圖的鄰接矩陣表示結構 typedef struct graph; //函式宣告 void creategraph(graph *g);//建立圖g void kruskal(graph *g); void creategraph(graph *g)//建立圖g } } void kruskal(graph *g) //初始化set for(i=1;i<=g->vnum;i++) while(k<=g->vnum-1)//v-1次合併連通部件操作:union。v-1=e,就是查詢出所有滿足最小生成樹的邊 } visited[a][b]=1; visited[b][a]=1; min=maxweight; if(set[a]!=set[b])//a b不在乙個連通分量中,則合併
最小生成樹之prim演算法 kurskal演算法
首先,我們來說一下圖當中的最小生成樹,對於乙個無向圖來說,它的最小生成樹的定義如下 1,該數經過所有的結點 2,經過的所有的結點的邊權之和最小 3,這棵樹的起點可以是任意的點,不過一般都是題目中指定的 prim演算法 適用範圍 邊多點少的稠密圖。複雜度 o v 2 與dijkstra演算法相比,該演...
Prime演算法生成最小生成樹
雖說是生成樹,但我只將生成的邊輸出了。至於怎麼用這些邊來建立樹。我不知道 1 prime方法生成最小生成樹 2void graphadjacencylistweight generatemscpprime int firstvertex 1213 closeedge firstvertex star...
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...