最小生成树实现

最小生成树的引入是基于城市之间建立通信网。在建设当中构造连通网的最小代价生成树,也就是一棵树,每个节点之间都可以到达,并且图中边的权值和最小。以数据分析的角度来看待这个问题就是,在图中边集挑选最短的n-1条边。其中有两种算法:Prim和Kruskal。一个是对点展开工作,一个是对边展开工作。在实现的时候用closedge存储每个节点到最小树的距离,同时标记一个节点时候加入这棵树。
#include "graph.h"
#include <stdio.h>
/*********************************************/
/*          最小生成树算法                   */
/*          参数:G  开始点                  */
/*          功能                           */
/*********************************************/
void MiniSpanTree_PRIM(const MGraph *g,const int VerNum)
{
int closedge[MAX_VERTEX_NUM];          //记录节点到树的权值 
int i;
//得到起始点邻接的点权值
    //不邻接的都是最大值 
for(i=0;i<g->vexnum;i++)                
{
closedge[i] = g->arcs[VerNum][i];
}
//值为0表明该点已加入树 
closedge[VerNum] = 0;
//逐渐构建树,每次加入一个点 
for(int j=0;j<g->vexnum-1;j++)
{
      int temp = INT_MAX;        //记录最小权值 
      int vtemp = 0;             //记录将加入点
            //查找到最小权值点 
        for(i=0;i<g->vexnum;i++)
{
if(closedge[i]&&(temp > closedge[i]))
{
temp = closedge[i];
vtemp = i;
}
}
  printf("The node[%d]:%d\n",vtemp,temp);
//由于树改变了,所以改变每个节点到树的值 
  for(i=0;i<g->vexnum;i++)
{
if(closedge[i] > g->arcs[vtemp][i])
{
closedge[i] = g->arcs[vtemp][i];
}
}
    closedge[vtemp] = 0;           //设置为加入点 
}
}
/*test
6 10
1 2 3 4 5 6END
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
end*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值