Krusal算法 方法一

// 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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值