Kruskal算法 (并查集)

本文详细介绍了Kruskal算法的基本原理及其实现过程。通过使用并查集数据结构,该算法可以有效地解决最小生成树问题。文章包括了核心数据结构定义、关键函数说明以及完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kruskal算法(并查集)

数据:

int root[]:存放节点的根,初始化时候全部等于本身。

struct node{

   int x,y,distance;

   void set ( int a, int b, int w ) { x=a,y=b,distance=w; }

   }Node[];

   :存放图,定点,x,y.距离distance.

void cmp():比较函数,给qsort函数,用来按照distance从小到大排序。

void init() 初始化root[];

find函数:查找节点x的根节点。

merge函数,更新节点的根节点。

int sum:记录权值和。

int c.边数。

 

代码:

bool cmp ( const node &a, const node &b ) {

          return a.distance < b.distance;

}

void init () {

     for ( int i = 0; i <= N; ++ i )

          root[i] = i;

}

int find ( int x ) {

    return x != root[x] ? find ( root[x] ) : x;

}

void merge ( int x, int y ) {

     x = find ( x );

     y = find ( y );

     if ( x == y ) return;

     root[y] = x;

}

 

int main()

{

  init ();

           memset ( Node, 0, sizeof ( Node ) );

           int c = 0;

           for ( int i = 1; i <= N; ++ i ) {

                for ( int j = 1; j <= N; ++ j ) {

                     scanf ( "%d", &w );

                     Node[c++].set ( i,j,w );

                }

           }

           sort ( Node, Node + c, cmp );

           int sum = 0;

           for ( int i = 0 ; i < c; ++ i ) {

                if ( find ( Node[i].x ) != find ( Node[i].y ) ) {

                    sum += Node[i].distance;

                    merge ( Node[i].x, Node[i].y );

                }

           }

           printf ( "%d/n", sum );

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值