prim算法求最小生成树程序

本文介绍了一种使用Prim算法寻找带权无向图最小生成树的方法。通过创建图的邻接矩阵并采用Prim算法逐步构建最小生成树,最终输出最小生成树的边及其权重总和。
//用prim算法求最小生成树
#include <stdio.h>
#define INFINITY 32767
#define MAX 4
typedef struct{
        int vexnum;
        int arcs[MAX][MAX];
        }Graph;//图的结构体
 //*****************创建图的邻接矩阵 *****************
  void Creat_Graph(Graph *g)
      {
             int i,j,v1,v2,w,num;           
             printf("please input vertex number:/n");
             scanf("%d",&num);
             g->vexnum=num;
             for(i=0;i<num;i++)
                 for(j=0;j<num;j++)
                     if(i==j)
                        g->arcs[i][j]=0; //无环,对角线为0
                     else
                        g->arcs[i][j]=INFINITY;
              printf("please input vertex ,vertex ,weight :(end with -1,-1)/n");          
              do
                {     printf("<vertex1,vertex2,weight>:");
                      scanf("%d,%d,%d",&v1,&v2,&w);
                      if(v1>=0&&v1<num&&v2>=0&&v2<num)
                          {
                                 g->arcs[v1][v2]=w;
                                 g->arcs[v2][v1]=w;
                          }
                }while(!(v1==-1&&v2==-1));//循环的条件
     }
  //***************求最小生成树**********************
 int MiniSpanTree_PRIM(Graph g,int v,int tree[][3])//为什么不能用*g
      {
          int i,j,cost,p,min;
          int k;
          int lowcost[MAX],closevex[MAX];
          for(i=0;i<g.vexnum;i++)
              {
                      closevex[i]=v;
                      lowcost[i]=g.arcs[v][i];
              }    
              cost=0;
              p=0;
             for(i=0;i<g.vexnum-1;i++)
                  {
                         min=INFINITY;
                         for(j=0;j<g.vexnum;j++)
                             if(lowcost[j]!=0&&lowcost[j]<min)
                                 {
                                         min=lowcost[j];
                                         k=j;
                                 }
                              tree[p][0]=closevex[k];
                              tree[p][1]=k;
                              tree[p][2]=min;
                              p++;
                              cost=cost+min;
                              lowcost[k]=0;
                        for(j=0;j<g.vexnum;j++)
                            if(g.arcs[k][j]!=0&&g.arcs[k][j]<lowcost[j])
                                {
                                       lowcost[j]=g.arcs[k][j];                            
                                        closevex[j]=k;
                                }
                 }
                 return cost;
       }   
    //****************主函数******************************
    int main()
       {
              int tree[MAX][3];
              int k,cost;
              Graph g;
               Creat_Graph(&g);
              cost=MiniSpanTree_PRIM(g,1,tree);
              printf("The Minimum Cost Spanning Tree is/n");
              printf("  edg       weigth/n");
              for(k=0;k<g.vexnum-1;k++)
              printf("V%d--V%d        %d/n",tree[k][0],tree[k][1],tree[k][2]);
              printf("The tree Cost :%d /n",cost);
              getch();
              return 0;
       }
                 
                                                            
                       
                              
        
 
 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值