#include <iostream>
#include <bits/stdc++.h>
#define maxsize 1000
using namespace std;
int n,m;//为图的顶点数和边数;
struct Edge{
int u,v,w;/*u,v 为边的两个端点 cost为边的权值*/
};
Edge E[maxsize];//边集合的数组
int father[maxsize];//并查集数组
bool cmp(Edge a,Edge b){
//自定义的cmp
return a.w<b.w;
}
int findfather(int x){
while(x!=father[x]){
x=father[x];
}
return x;
}
/*初始化并查集数组*/
void initfather(){
for(int i=0;i<n;i++){
father[i]=i;
}
}
int Kruskal(){
int Edge_num=0;/*记录已经选择的边数,最小生成树的边数一定为n-1个*/
int ans=0;
initfather();
sort(E,E+m,cmp);/*将边集合进行排序*/
/*对边进行枚举*/
for(int i=0;i<m;i++){
int a=findfather(E[i].u);//查看这两个顶点是否已经放入到里面最小生成树里面了
int b=findfather(E[i].v);
if(b!=a){
father[a]=b;
ans+=E[i].w;
cout<<"这次选择的边的两端为"<<E[i].u<<' '<<E[i].v<<' '<<E[i].w<<endl;
Edge_num++;
}
if(Edge_num==n-1){
return ans;
}
}
}
int main()
{
cout<<"请输入图的顶点和边数:"<<endl;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>E[i].u>>E[i].v>>E[i].w;
}
cout<<Kruskal();
return 0;
}
/*
6个顶点和10条边数
6 10
0 1 4
0 4 1
0 5 2
1 2 1
1 5 3
2 3 6
2 5 5
3 4 5
3 5 4
4 5 3
*/
数据结构-----图的最小生成树Kruskal
猜你喜欢
转载自blog.csdn.net/qq_44741914/article/details/110432153
今日推荐
周排行