prim算法----代码注释解析

#include <stdio.h>
#include <stdlib.h>
#include <cstring>
int a[1005][1005], book[1005], dist[1005], sum, po[1005];
/*
*book[] 记录是否已经进入最小生成树
*dist[] 记录未进入顶点到已经入生成树顶点的最短路径(权值)
*po[] 记录未进入顶点最短路径所指向的已进入生成树的顶点(不一定所有题都需要)
*/


void prim(int n)
{
    int i, j;
    for( i = 0; i <n ; i++)
    {
        dist[i] = a[i][0];//初始每个顶点到0点的距离
        po[i] = 0;//初始化每个顶点指向0顶点
    }
    book[0] = 1;//赋值, 代表已进入最小生成树
    for(i = 1 ; i < n; i++)
    {
       int  pos;
       int Min = 100001;
        for( j = 0; j < n ;j++)
        {
            if(!book[j]&&Min>dist[j])得到已进入顶点到未进入生成树顶点的最短路径及对应顶点j
            {
                Min = dist[j];
                pos = j;
            }
        }
        sum += dist[pos];
        book[pos] = 1;//标记已进入
        printf("%d %d\n", pos+1, po[pos]+1);//输出结果
        for(j = 0 ; j < n ; j++)
        {
            if(!book[j]&&dist[j]>a[pos][j])//更新未进入点的最短路径及对应顶点
            {
                dist[j] = a[pos][j];
                po[j] = pos;
            }
        }
    }
    printf("%d\n", sum);
}

int main()
{
    int t, n , i, j ,k;
    scanf("%d", &t);
    while(t--)
    {
        sum = 0;
        memset(book, 0, sizeof(book));
        scanf("%d", &n);
//        for( i = 1 ; i <= n ;i++)
//        {
//            scanf("%d", &a[i]);
//        }
        for( i = 0 ; i < n ;i++)
        {
            for( j = 0 ; j < n; j++)
            {
                a[i][j]= 100;//先设定路径数为最大,视情况而定
            }
        }
        a[0][1]=6,a[0][2]=1,a[0][3]=5;
        a[1][0]=6,a[1][2]=5,a[1][4]=3;
        a[2][0]=1,a[2][1]=5,a[2][3]=5,a[2][4]=6,a[2][5]=4;
        a[3][0]=5,a[3][2]=5,a[3][5]=2;
        a[4][1]=3,a[4][2]=6,a[4][5]=6;
        a[5][3]=2,a[5][2]=4,a[5][4]=6;
        prim(n);
    }
    return 0;
}

输入样例如下图:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值