最小生成树(Prim算法)加标记前驱的第二种方法

/*Input:

6 10
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

Output:

V1-V3=1
V3-V6=4
V6-V4=2
V3-V2=5
V2-V5=3
最小权值和=15
*/

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f
#define N 100

int lowcost[N];//标记是否在集合S中并协助找到集合S中元素到其他元素的最小值min
int cost[N][N];
int path[N];//标记前驱
int n,m;
int Prim()
{
   int i,w,v;
   int ans=0;
   for(i=2;i<=n;++i)
   { 
      lowcost[i]=cost[1][i];
      path[i]=1;
    }
    path[1]=0;

    for(i=2;i<=n;++i)
    {
        int min=INF;
        for(w=2;w<=n;++w)
        {
           if(lowcost[w]<min&&lowcost[w])
               {
                 v=w;
                 min=lowcost[w];
                }
           }
printf("V%d--V%d == %d\n",path[v],v,min);

           ans+=min;
           path[w]=v;
           lowcost[v]=0;

           for(w=2;w<=n;++w)
           {
               if(cost[v][w]<lowcost[w])
               {
                  lowcost[w]=cost[v][w];
                  path[w]=v;
                 }
             }

       }
       return ans;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(cost,INF,sizeof(cost));
        int i,a,b,c;
        for(i=0;i<m;++i)
        {
          scanf("%d%d%d",&a,&b,&c);
          cost[a][b]=c;
          cost[b][a]=c;
          }
          printf("最小权值和=%d\n",Prim());
      }
      return 0;
 }



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值