最小生成树(克鲁斯卡尔算法)
生活随笔
收集整理的這篇文章主要介紹了
最小生成树(克鲁斯卡尔算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于克魯斯卡爾算法他是針對邊的。而普里姆算法是針對頂點的。
下面還是用普里姆算法的圖。
如下:
因此可以構造邊集數組。
如下圖所示:
代碼如下:
int Find(int *parent, int f) {while( parent[f] > 0 ){f = parent[f];}return f; }// Kruskal算法生成最小生成樹 void MiniSpanTree_Kruskal(MGraph G) {int i, n, m;Edge edges[MAGEDGE]; // 定義邊集數組int parent[MAXVEX]; // 定義parent數組用來判斷邊與邊是否形成環路for( i=0; i < G.numVertexes; i++ ){parent[i] = 0;}for( i=0; i < G.numEdges; i++ ){n = Find(parent, edges[i].begin); // 4 2 0 1 5 3 8 6 6 6 7m = Find(parent, edges[i].end); // 7 8 1 5 8 7 6 6 6 7 7if( n != m ) // 如果n==m,則形成環路,不滿足!{parent[n] = m; // 將此邊的結尾頂點放入下標為起點的parent數組中,表示此頂點已經在生成樹集合中printf("(%d, %d) %d ", edges[i].begin, edges[i].end, edges[i].weight);}} } 根據上面的代碼,模擬計算機可得:
最后圖可的,最小生成樹如下:
總結
以上是生活随笔為你收集整理的最小生成树(克鲁斯卡尔算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL入门之数据库介绍及MySQL介
- 下一篇: linux指令解压rpm,dpkg r