Krusal算法 方法一

本文介绍了使用克鲁斯卡尔算法构建最小生成树的过程。通过维护顶点集合和边的排序,逐步找到并合并未连接的集合,直到所有顶点连接成一个集合。算法涉及到集合操作、边的排序和最小边的选择,旨在避免形成环路。

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

// krusal  算法根据  MST  性质。若点集合 U ~ 点集合  V  存在一点最短路径 s~t,  则最小生成树必包含  s~t  这条路。
//  利用反证法(或者剪贴法)可以证明

// krusal  算法是将整个图每个顶点看成一个集合。主要是合并集合,直到只剩一个集合为止

//  这里主要以集合为考虑对象  有向图


//  用集合去找最小边
#include  "stdafx.h"
#include  <iostream>
#include  <vector>
#include  <list>

enum
{
       Vertex_No_Connection     = -1,
       Vertex_Total_Number     = 5,
       Vertex_Max_Edge_Value    = 10000,

       Vertex_No_In_Set        = 0,
       Vertex_In_Set           = 1,
};

int  arrayPathScheme  [ Vertex_Total_Number ][  Vertex_Total_Number ] =
{
     0,   10,   -1,  30,  100,
     -1,   0,   50,  -1,   -1,
     -1,  -1,   0,   -1,   10,
     -1,  -1,   20,   0,   60,
     -1,  -1,   -1,  -1,    0,
};


//  顶点  V0 ~  其他顶点的排序
//  顶点  V1 ~  其他顶点的排序
// V2  V3   V4
std  :: list <  int >  listVertexEdgeSortSet  [ Vertex_Total_Number ];

struct  SVertexSet
{
       int  idVertexSet    //  集合  ID   每个 ID  为唯一值,唯一标识这个集合
       std :: vector  < int >  vecVetexSet ;            //  当前顶点的集合
       int  nSourceVertex  ;                       //  在该集合内
       int  nMinEdgeToOtherSet  ;    
       int  nDestVertex  ;
       SVertexSet *  pNextDestVetex  ;

       SVertexSet (  int  nVertexIndex  )
     {
            pNextDestVetex  =  NULL  ;
            nSourceVertex  =  nVertexIndex  ;
            idVertexSet    =  nVertexIndex  ;
            nDestVertex  =  Vertex_No_Connection  ;
            vecVetexSet . push_back  (  nVertexIndex  );

            nMinEdgeToOtherSet  =  Vertex_Max_Edge_Value  ;

            if ( ! listVertexEdgeSortSet  [ nVertexIndex ].  empty () )
          {
                int  nDestIndex  =  listVertexEdgeSortSet  [ nVertexIndex ].  back ();
                nDestVertex  =  nDestIndex  ;
                nMinEdgeToOtherSet  =  arrayPathScheme  [ nVertexIndex ][  nDestVertex ];
          }
     }
};

std  :: list <  SVertexSet *>  listVertexSet  ;

 
//  数组预处理处理回环的值  i -> j = 50   同时  j -> i = 30.
//  注销回环。则将  i -> j = 50  改为 i -> j = -1.
void  arrayInit ()
{
       for (  int  i  = 0;  i  <  Vertex_Total_Number  - 1; ++ i  )
     {
            for (  int  j  =  i  + 1;  j  <  Vertex_Total_Number ; ++  j  )
          {
                if (  arrayPathScheme  [ i ][  j ] > 0 &&  arrayPathScheme  [ j ][  i ] > 0 )
              {
                     if (  arrayPathScheme  [ i ][  j ] <  arrayPathScheme  [ j ][  i ] )
                          arrayPathScheme [ j  ][ i ] = -1;
                     else
                          arrayPathScheme [ i  ][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值