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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

克鲁斯卡尔(Kruskal)算法求最小生成树

發布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 克鲁斯卡尔(Kruskal)算法求最小生成树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、基本思想:設無向連通網為G=(V, E),令G的最小生成樹為T=(U, TE),其初態為U=V,TE={ },然后,按照邊的權值由小到大的順序,考察G的邊集E中的各條邊。若被考察的邊的兩個頂點屬于T的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到T中,同時把兩個連通分量連接為一個連通分量;若被考察邊的兩個頂點屬于同一個連通分量,則舍去此邊,以免造成回路,如此下去,當T中的連通分量個數為1時,此連通分量便為G的一棵最小生成樹。
2、示例:

3、代碼實現如下:

#include "stdio.h" #include "stdlib.h" struct edge {int m;int n;int d; }a[5010]; int cmp(const void *a,const void *b) //按升序排列 {return ((struct edge *)a)->d>((struct edge *)b)->d; } int main(void) {int i,n,t,num,min,k,g,x[100];printf("請輸入頂點的個數:");scanf("%d",&n);t=n*(n-1)/2;for(i=1;i<=n;i++)x[i]=i;printf("請輸入每條邊的起始端點、權值:/n");for(i=0;i<t;i++)scanf("%d %d %d",&a[i].m,&a[i].n,&a[i].d); //輸入每條邊的權值qsort(a,t,sizeof(a[0]),cmp);min=num=0;for(i=0;i<t && num<n-1;i++){for(k=a[i].m;x[k]!=k;k=x[k]) //判斷線段的起始點所在的集合x[k]=x[x[k]];for(g=a[i].n;x[g]!=g;g=x[g]) //判斷線段的終點所在的集合x[g]=x[x[g]];if(k!=g) //如果線段的兩個端點所在的集合不一樣{x[g]=k;min+=a[i].d;num++;printf("最小生成樹中加入邊:%d %d/n",a[i].m,a[i].n);}}printf("最小生成樹的權值為:%d/n",min);system("pause");return 0; }

?

總結

以上是生活随笔為你收集整理的克鲁斯卡尔(Kruskal)算法求最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

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