日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最小生成树之Kruskal算法

發(fā)布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树之Kruskal算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖片描述

?

算法思想

  采用貪婪策略,連續(xù)的按最小的權選擇邊,并且當邊不產生圈時就把它作為取定的邊


?

算法思路

  問題出現(xiàn)

    1.怎樣選擇最小權的邊

       用個排序算法

    2.怎樣判斷加入的邊是否會產生圈

      (用到不相交集的知識)

      判斷邊的兩個端點是否在同一棵樹中,若處于同一棵樹則會產生圈

  思路

  1.將邊的權值將邊按升序排序

  2.每次選擇最小的邊,判斷兩個端點是否是等價類,不是則加入這條邊并且合并這兩個端點

  3.如此重復1-2步驟到所有邊都被處理

?


?

代碼實現(xiàn)

#include <iostream> #include <algorithm> #include <cstdlib>using namespace std;#define VERSIZE 9 //頂點數(shù) #define MAXSIZE 15//邊數(shù)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)//邊數(shù)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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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