最小生成树之Kruskal算法
生活随笔
收集整理的這篇文章主要介紹了
最小生成树之Kruskal算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖片描述
?
算法思想
采用貪婪策略,連續的按最小的權選擇邊,并且當邊不產生圈時就把它作為取定的邊
?
算法思路
問題出現
1.怎樣選擇最小權的邊
用個排序算法
2.怎樣判斷加入的邊是否會產生圈
(用到不相交集的知識)
判斷邊的兩個端點是否在同一棵樹中,若處于同一棵樹則會產生圈
思路
1.將邊的權值將邊按升序排序
2.每次選擇最小的邊,判斷兩個端點是否是等價類,不是則加入這條邊并且合并這兩個端點
3.如此重復1-2步驟到所有邊都被處理
?
?
代碼實現
#include <iostream> #include <algorithm> #include <cstdlib>using namespace std;#define VERSIZE 9 //頂點數 #define MAXSIZE 15//邊數typedef struct node EDGE; typedef int Vertex; typedef int Position;struct node {Vertex start;//邊起始頂點Vertex end;//邊結束頂點int weigth;//權重 }Edge[MAXSIZE];int VerSet[VERSIZE];//存儲頂點的集合//初始化集合 void InitSet(int VerSet[],int n) {int i = 0;for (i = 1; i <= n; i++)VerSet[i] = -1; }//讀圖并初始化 void ReadGraph(EDGE Edge[], int m)//邊數m {int i = 0;for (i = 0; i < m; i++){cout << "請輸入第" << i+1 << "條邊:";cin >> Edge[i].start;cin >> Edge[i].end;cout << "請輸入邊" << "(" << Edge[i].start << "," << Edge[i].end << ")" << "的權重:";cin >> Edge[i].weigth;} }//找出頂點在哪顆樹 Position Find(int VerSet[], Vertex x) {if (VerSet[x] < 0)return x;elsereturn VerSet[x] = Find(VerSet, VerSet[x]); }//合并兩個頂點與一棵樹 void Union(int VerSet[], Vertex x, Vertex y) {Vertex root1 = Find(VerSet,x);Vertex root2 = Find(VerSet,y);if (VerSet[root1] > VerSet[root2])VerSet[root1] = root2;else{if (VerSet[root1] == VerSet[root2])VerSet[root1]--;VerSet[root2] = root1;} }int kruskal(EDGE Edge[],int VerSet[],int m) {int sum = 0;int i = 0;for (i = 0; i < m; i++){if (Find(VerSet, Edge[i].start) != Find(VerSet, Edge[i].end))//判斷兩個端點是否在同一棵樹中 {Union(VerSet, Edge[i].start, Edge[i].end);//合并兩個頂點sum += Edge[i].weigth;cout << "邊" << Edge[i].start << "," << Edge[i].end << endl;//輸出選擇的邊 }}return sum; }bool compare(EDGE a,EDGE b) {return a.weigth < b.weigth; }int main() {int n = 7;int m = 12;InitSet(VerSet, n);ReadGraph(Edge, m);sort(Edge, Edge + n , compare);for (int i = 0; i < m; i++){cout << Edge[i].weigth << " ";}cout << endl;cout << "最小生成樹為:" << kruskal(Edge, VerSet, m) << endl;system("pause");return 0; }?
?
實驗結果
?
修改補充后的:SakuraOne Kruskal算法
?
轉載于:https://www.cnblogs.com/myworld7/p/7470542.html
總結
以上是生活随笔為你收集整理的最小生成树之Kruskal算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k-means-algorithm
- 下一篇: Java学习个人备忘录之线程间的通信