最小生成树——普利姆算法(prim)

这里写图片描述

这是摘抄自《大话数据结构》中的一句话,其实我是没看懂,但是看了代码,加上百度了之后,普利姆算法的步骤:
1、先假设之后一个节点,并同时把这些顶点的权值放在一个数组里,还有创建一个数组保存最小权值顶点的下标,找到这个节点边上的最小权值,这边的另一个节点为K
2、从节点K开始,再次寻找,把与k有关的权值放在一个数组里,若是比数组的值小就修改,同时修改下标的值,否则不改
3、重复2的步骤

好吧,我也不知道自己在说啥,直接上代码

#include<stdio.h>

#define MAX 100
#define INFINITY 65535

typedef struct
{
    int vestex[MAX];
    int ves;
    int edge;
    int e[MAX][MAX];
}MGraph;

void createMGraph(MGraph* G)
{
    int i;
    int j;
    int w;
    int start;
    int end;

    printf("please input the vesnum and egdenum:\n");
    scanf("%d%d",&G->ves,&G->edge);

    printf("please input the ves:\n");
    for(i = 0; i < G->ves; i++)
    {
        scanf("%d",&G->vestex[i]);
    }
// 初始化
    for(i = 0; i < G->ves; i++)
    {
        for(j = 0; j < G->ves; j++)
    {
        G->e[i][j] = INFINITY;
    }
    }

    printf("please input(vi,vj):\n");
    for(i = 0; i < G->edge; i++)
    {
        scanf("%d%d%d",&start,&end,&w);
    G->e[start][end] = w;
    G->e[end][start] = G->e[start][end];//无向图,矩阵对称
    }

}


void MiniSpanTree_prim(MGraph G)
{
    int min;
    int i;
    int j;
    int k;

    int lowcast[MAX];//保存权值
    int adjvex[MAX];//保存顶点下标

    lowcast[0] = 0;//初始化第一个权值,即v0加入了生成树
    adjvex[0] = 0;
    for(i = 1; i < G.ves; i++)
    {
        lowcast[i] = G.e[0][i];//与v0顶点之间有权值的存入数组
    adjvex[i] = 0;//将顶点初始化为0
    }

    for(i = 1; i < G.ves; i++)
    {
        min = INFINITY;
    j = 1; k = 0;
    while(j < G.ves)
    {
        if(lowcast[j] != 0 && lowcast[j]<min)
        {
            min = lowcast[j];//找与顶点0相关的最小的权值
        k = j;//权值最小的下标
        }

        j++;
    }
    printf("(%d,%d)",adjvex[k],k);//打印当前顶点中权值最小的边
    lowcast[k] = 0;
    for(j = 1; j < G.ves; j++)
    {
        if(lowcast[j] != 0 && G.e[k][j] < lowcast[j])
        {
            lowcast[j] = G.e[k][j];
        adjvex[j] = k;
        }

    }
    }
}
void display(MGraph G)
{
    int i;
    int j;

    for(i = 0; i < G.ves; i++)
    {
        for(j = 0; j < G.ves; j++)
    {
        printf("%4d ",G.e[i][j]);
    }
    printf("\n");
    }
}
int main()

{
   MGraph G;
   createMGraph(&G);
//   display(G);

   MiniSpanTree_prim(G);
}

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值