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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基于并查集的kruskal算法

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于并查集的kruskal算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <iostream> //并查集的kruskal算法
using namespace std;
const int max_ve=1005,max_ed=15005;
int n,m,i; //n,m分別記錄頂點數和邊數
struct node
{
int par,ans;
}vertex[max_ve];
//頂點
struct Edge
{
int u,v,weigh;
}edge[max_ed];
//
int cmp(const void* a,const void* b)
{
return (*(Edge*)a).weigh-(*(Edge*)b).weigh;
}
int find_p(int j) //在處理兩個頂點是否在同個集合內要用到并查集
{
if(vertex[j].par!=j)
{
vertex[j].par
=find_p(vertex[j].par);
}
return vertex[j].par;
}
bool union_set(int s,int t)
{
int os=find_p(s),ot=find_p(t);
if(os==ot)
return false;
if(vertex[os].ans>vertex[ot].ans)
vertex[ot].par
=os;
else
vertex[os].par
=ot;
if(vertex[os].ans==vertex[ot].ans)
vertex[ot].ans
++;
return true;
}
int main()
{
int sum,ct;
scanf(
"%d%d",&n,&m);
for(i=1;i<=n;++i) //初始化,頂點從1到n
{
vertex[i].par
=i;vertex[i].ans=0;
}
for(i=0;i<m;++i) //輸入邊的信息:起點,終點,權重
{
scanf(
"%d%d%d",&edge[i].u,&edge[i].v,&edge[i].weigh);
}
qsort(edge,m,
sizeof(edge[0]),cmp);
sum
=0;ct=0;
for(i=0;i<m&&ct<n-1;++i) //當ct==n-1說明有n-1條邊,即所有的頂點都已連接上,終止算法
{
if(union_set(edge[i].u,edge[i].v))
{
++ct; //邊數+1
sum+=edge[i].weigh;
}
}
printf(
"%d\n",sum); //sum為最小生成樹所有邊的總和
return 0;
}

  

轉載于:https://www.cnblogs.com/mjc467621163/archive/2011/07/17/2108518.html

總結

以上是生活随笔為你收集整理的基于并查集的kruskal算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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