克鲁斯卡尔算法(Kruskal算法) 考研计算机

相比较克鲁斯卡尔来说,prime 和 迪杰斯特拉是以点展开验证边。而克鲁斯卡尔是以边为展开看连接点点是否属于都一个跟(并查集)

  #include <stdio.h>
  #include <string.h>
  #include <algorithm>
  #define MAXN 11  //顶点个数的最大值
  #define MAXM 20  //边的个数的最大值
  using namespace std; 
//测试样例
//7 12
//1 2 12
//1 6 16
//1 7 14
//2 6 7
//2 3 10
//3 6 6
//3 4 3
//3 5 5
//4 5 4
//5 6 2
//5 7 8
//6 7 9  
  struct edge  //边
  {
     int u, v, w; //边的顶点、权值
 }edges[MAXM]; //边的数组
 
 int parent[MAXN];  //parent[i]为顶点 i 所在集合对应的树中的根结点
 int n, m;  //顶点个数、边的个数
 int i, j;  //循环变量
 void UFset( )  //初始化
 {
     for( i=1; i<=n; i++ ) 
         parent[i] = -1;
 }
 int Find( int x ) //查找并返回节点 x 所属集合的根结点
 {
     int s; //查找位置
     for( s=x; parent[s]>=0; s=parent[s] );
     while( s!=x ) //优化方案―压缩路径,使后续的查找操作加速。
     {
         int tmp = parent[x];
         parent[x] = s;
         x = tmp;
     }
     return s;
 }
 
 //将两个不同集合的元素进行合并,使两个集合中任两个元素都连通
 void Union( int R1, int R2 )
 {
     int r1 = Find(R1), r2 = Find(R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值