最小生成树——普利姆算法(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);
}

结果:
这里写图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
普利算法是一种用于解无向图的最小生成树的基本算法。它以一个起始节点开始,每次将一个未被访问的节点加入到最小生成树集合中,并选择与该集合相邻的边中权重最小的边和它连接的未访问节点,直到最小生成树集合包含了图中的所有节点。普利算法的时间复杂度为O(n^2)。 以下是普利算法的步骤: 1. 选择一个起始节点作为最小生成树的起点。 2. 将该起始节点加入最小生成树集合,并将其标记为已访问。 3. 在所有与最小生成树集合相邻的边中,选择权重最小的边和它连接的未访问节点。 4. 将该边和节点加入最小生成树集合,并将该节点标记为已访问。 5. 重复步骤3和步骤4,直到最小生成树集合包含了图中的所有节点。 以下是Python实现普利算法的代码: ```python def prim(graph): # 选择一个起始节点作为最小生成树的起点 start_node = list(graph.keys())[0] # 将该起始节点加入最小生成树集合,并将其标记为已访问 visited = [start_node] # 初始化最小生成树的权重为0 min_weight = 0 # 初始化最小生成树的边为空 min_tree = [] # 重复步骤3和步骤4,直到最小生成树集合包含了图中的所有节点 while len(visited) < len(graph): # 在所有与最小生成树集合相邻的边中,选择权重最小的边和它连接的未访问节点 min_edge = None for node in visited: for neighbor, weight in graph[node].items(): if neighbor not in visited: if min_edge is None or weight < min_edge[2]: min_edge = (node, neighbor, weight) # 将该边和节点加入最小生成树集合,并将该节点标记为已访问 visited.append(min_edge[1]) min_weight += min_edge[2] min_tree.append(min_edge) # 返回最小生成树的权重和边 return min_weight, min_tree ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值