日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

最小生成树之Kruskal算法

發布時間:2025/7/14 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树之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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。