prim算法

本文介绍了一个使用C语言实现的普里姆(Prim)算法,该算法用于求解带权无向图的最小生成树问题。通过定义结构体和枚举类型来组织图的数据结构,并实现了创建无向图、寻找最小生成树的功能。文中详细展示了如何输入顶点数、边数以及各条边的权重,并最终输出构成最小生成树的边。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普里姆算法

#include<stdio.h>
#include<stdlib.h>
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef enum {DG,DN,UDG,UDN}GraphKind;
typedef enum {ERROR,OK}Status;
typedef int VRType;
typedef int VertexType;
typedef struct ArcCell{
    VRType adj;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum, arcnum;
    GraphKind kind;
}MGraph;
struct dge{
    VertexType adjvex;
    VRType lowcost;
}closedge[MAX_VERTEX_NUM];
VertexType LocateVex(MGraph G, VertexType u) {
    return u - 1;
}
//void MiniSpanTree_PRIM(MGraph G, VertexType u);
Status CreateUND(MGraph &G) {
    printf("enter vexnum,arcnum:\n");
    scanf("%d,%d", &G.vexnum, &G.arcnum);
    printf("enter vexs:\n");
    for (int i = 0; i < G.vexnum; i++) scanf("%d", &G.vexs[i]);
    for (int i = 0; i < G.vexnum; i++)
        for (int j = 0; j < G.vexnum; j++) G.arcs[i][j] = { INFINITY };
    for (int i = 0; i < G.vexnum; i++)
        for (int j = 0; j < G.vexnum; j++)G.arcs[i][j].adj = INFINITY;
    printf("enter arcs:v1,v2,w:\n");
    for (int k = 0; k < G.arcnum; k++) {
        VertexType v1, v2;
        VRType w;
        scanf("%d,%d,%d", &v1, &v2, &w);
        int i = LocateVex(G, v1);
        int j = LocateVex(G, v2);
        G.arcs[i][j].adj = G.arcs[j][i].adj = w;
    }
    return OK;
}

int minmum(MGraph G,int k) {
    int t = INFINITY , loc = 0;                       //???
    for (int i = 0; i < G.vexnum; i++) {
        if (i != k&&closedge[i].lowcost > 0 && closedge[i].lowcost < t) {
            t = closedge[i].lowcost;
            loc = i;
        }
    }
    return loc;
}

void MiniSpanTree_PRIM(MGraph G, VertexType u){
    int k = LocateVex(G,u);
    for (int j = 0; j < G.vexnum; j++) {
        if (j != k)closedge[j] = { u,G.arcs[k][j].adj };//???
    }
    closedge[k].lowcost = 0;
    for (int i = 1; i < G.vexnum; i++) {
        k = minmum(G,k);
        printf("%d->%d\n", closedge[k].adjvex, G.vexs[k]);
        closedge[k].lowcost = 0;
        for (int j = 0; j < G.vexnum; j++)
            if (G.arcs[k][j].adj < closedge[j].lowcost)
                closedge[j] = { G.vexs[k],G.arcs[k][j].adj };
    }
}
int main()
{
    MGraph G;
    CreateUND(G);
    MiniSpanTree_PRIM(G,1);
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值