普里姆算法

普里姆算法:每次寻找一条权值较少,且一个顶点在集合内,另一个不在集合内的边,添加到集合内,因为该点的添加导致其余dis[i]储存的非生成树点到生成树的距离改变,如果其余非生成树点到该点的距离比原来缩短了,那就改变dis[i]的值.


#include <stdio.h>
int main()
{
 int dis[101];
 int book[101];
 int a[101][101];
 int i,j,n,b,c,d,m,k,sum,count,min;
 scanf("%d%d",&n,&m);
 for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (i==j) a[i][j]=0;
 else a[i][j]=9999;
 for (i=1;i<=m;i++)
 {
     scanf("%d%d%d",&b,&c,&d);
     a[b][c]=d;
     a[c][b]=d;
 }
 for(i=1;i<=n;i++)
    dis[i]=a[1][i];
 for (i=1;i<=n;i++)
    book[i]=0;
    book[1]=1;
    sum=0;
    count=1;
    while(count<n)
    {
        min=9999;
        for (i=1;i<=n;i++)//每次找距离树的最小边
            if((book[i]==0)&&(dis[i]<min))//最小边不能被访问过
        {

            min=dis[i];
            j=i;

        }
        book[j]=1;
        count++;
        sum=sum+min;//记录代价
        for (k=1;k<=n;k++)
            if ((book[k]==0)&&(dis[k]>a[j][k]))//r如果新增的点能够缩短非树顶点到生成树的距离(只需缩短未添加到集合内的点就可以了)(类似迪杰斯特拉算法)
        {

            dis[k]=a[j][k];
        }


    }
    printf("%d\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值