普里姆算法(Prim)

图的最小生成树构造算法:普里姆算法(Prim)

#define MAXV  <最大顶点个数> 
typedef struct 
{
  int no;//顶点编号 
  InfoType info;//顶点其他信息      
}VertexType;//顶点类型 


typedef struct
{
  int edges[MAXV][MAXV];//邻接矩阵的边数组 
  int n,e;//顶点数,边数 
  VertexType vexs[MAXV];//存放顶点信息        
}MGraph;//完整的图邻接矩阵类型 

#define INF 32767


void Prim(MGraph g,int v)
{
  int lowcost[MAXV];//存放边的权值  
  int min;
  int closest[MAXV],i,j,k;//closest数组:存放顶点编号
  for(i=0;i<g.n;i++)
  {
    lowcost[i]=g.edges[v][i];
    closest[i]=v;                  
  }   
  for(i=1;i<g.n;i++)//找出(n-1)个顶点 
  {
    min=INF;
    for(j=0;j<n;j++)//在(V-U)中找出离U最近的顶点k 
      if(lowcost[j]!=0 && lowcost[j]<min)
      {
        min=lowcost[j];
        k=j;       //k记录最近顶点的编号          
      }
    printf("边(%d,%d)权为:%d\n",closest[k],k,min);
    lowcost[k]=0; //标记k已经加入U 
    for(j=0;j<g.n;j++)//修改数组lowcost和closest 
      if(g.edge[k][j]!=0 && g.edge[k][j]<lowcost[j]) 
      {
        lowcost[j]=g.edges[k][j];
        closest[j]=k;                    
      } 
  } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值