数据结构-----图的最小生成树Kruskal

#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
*/

猜你喜欢

转载自blog.csdn.net/qq_44741914/article/details/110432153