图-最小生成树-kruskal算法

这个算法比较简单,对于这个网友已经写烂了,我现在写的不过是老生常谈的东西了。


还是简单记一下步骤

1:边排序

2:从小到大加入边,不要生成回路

#include<iostream>
#include<algorithm>
#define MAXN 2000
using namespace std;
int n,e;//点的个数,边的个数

struct k{
int x;
int y;
int w;
}k_e[MAXN];
//起点,终点,权值
int dad[MAXN];//父亲集合

bool cmp(k a,k b)
{
    return a.w<b.w;
}

int getfather(int x)
{
    if(x==dad[x])
        return x;
    dad[x]=getfather(dad[x]);//跟新查找X的父亲集合
    return dad[x];
}

void kruskal(){
  int i,p,ans;
  for(i=1;i<=n;i++)
    dad[i]=i;//初始化自己为自己父亲
  p=1;ans=0;//p为加入的边数
  for(i=1;i<=e;i++)
  {
      if(getfather(k_e[i].x)!=getfather(k_e[i].y))//加入的边父亲是否为同一个,如果是,则加入该边会生成回路
      {
          cout<<k_e[i].x<<k_e[i].y<<k_e[i].w;//选取的边
          cout<<"------------"<<endl;
          ans+=k_e[i].w;//ans记录权重值和
          dad[getfather(k_e[i].x)]=k_e[i].y;//加入后使他们的父亲为同一个
          p++;
          if(p==n){
            cout<<ans<<endl;
             return ;
      }
  }
  }
  return ;
}
/*
5 7
1 3 1
1 5 3
3 4 1
4 2 5
2 5 5
3 5 2
4 5 2
*/

int main(){//测试

int i,j;
cout<<"点个数和边数依次为:"<<endl;
cin>>n>>e;
 cout<<"边的构造是:"<<endl;
 cout<<"起点 终点 权值"<<endl;
for(i=1;i<=e;i++)
  cin>>k_e[i].x>>k_e[i].y>>k_e[i].w;
sort(k_e+1,k_e+e+1,cmp);
for(i=1;i<=e;i++)
  cout<<k_e[i].w;
  cout<<endl;
kruskal();
system("pause");
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值