第十三周--最小生成树的普里姆算法

本文通过C语言实现普里姆算法来寻找加权无向图的最小生成树。使用数组表示图并逐步添加边,直到形成一棵包含所有顶点的树。文章提供了完整的源代码及运行结果。
/* 
 *Copyright (c) 2015 烟台大学计算机与控制工程学院 
 *All right reserved. 
 *标题:数据结构实践——最小生成树的普里姆算法 
 *作者:杨珺 
 *date:2015年11月23日 
 *版本:V1.0.1 
 *操作系统:XP 
 *运行环境:VC6.0 
 *问题描述:验证最小生成树的普里姆算法
 */  


验证最小生成树的普里姆算法用到图存储结构的“算法库”点击打开链接

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

void Prim(MGraph g,int v)
{
    int lowcost[MAXV];          //顶点i是否在U中
    int min;
    int closest[MAXV],i,j,k;
    for (i=0; i<g.n; i++)           //给lowcost[]和closest[]置初值
    {
        lowcost[i]=g.edges[v][i];
        closest[i]=v;
    }
    for (i=1; i<g.n; i++)           //找出n-1个顶点
    {
        min=INF;
        for (j=0; j<g.n; j++)     //在(V-U)中找出离U最近的顶点k
            if (lowcost[j]!=0 && lowcost[j]<min)
            {
                min=lowcost[j];
                k=j;            //k记录最近顶点的编号
            }
        printf(" 边(%d,%d)权为:%d\n",closest[k],k,min);
        lowcost[k]=0;           //标记k已经加入U
        for (j=0; j<g.n; j++)       //修改数组lowcost和closest
            if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j])
            {
                lowcost[j]=g.edges[k][j];
                closest[j]=k;
            }
    }
}

int main()
{
    MGraph g;
    int A[6][6]=
    {
        {0,10,INF,INF,19,21},
        {10,0,5,6,INF,11},
        {INF,5,0,6,INF,INF},
        {INF,6,6,0,18,14},
        {19,INF,INF,18,0,33},
        {21,11,INF,14,33,0}
    };
    ArrayToMat(A[0], 6, g);
    printf("最小生成树构成:\n");
    Prim(g,0);
    return 0;
}


运行结果:

 

 

 

题目描述 1-7 最小生成树普里姆算法) 分数 4 全屏浏览 作者 王东 单位 贵州师范学院 试实现普里姆最小生成树算法。 函数接口定义: void Prim(AMGraph G, char u); 其中 G 是基于邻接矩阵存储表示的无向图,u表示起点 裁判测试程序样例: #include <iostream> #define MVNum 10 #define MaxInt 32767 using namespace std; struct edge{ char adjvex; int lowcost; }closedge[MVNum]; typedef struct{ char vexs[MVNum]; int arcs[MVNum][MVNum]; int vexnum,arcnum; }AMGraph; int LocateVex(AMGraph G , char v);//实现细节隐藏 int Min(AMGraph G);//实现细节隐藏 int CreateUDN(AMGraph &G);//实现细节隐藏 void Prim(AMGraph G, char u); int main(){ AMGraph G; CreateUDN(G); char u; cin >> u; Prim(G , u); return 0; } /* 请在这里填写答案 */ 输入样例: 第1行输入结点数vexnum边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。最后一行输入一个字符表示最小生成树的起始结点。 7 9 0123456 0 1 28 0 5 10 1 2 16 1 6 14 2 3 12 3 6 18 3 4 22 4 5 25 4 6 24 0 输出样例: 按最小生成树的生成顺序输出每条边。 0->5 5->4 4->3 3->2 2->1 1->6 ww.png 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB C++ (g++) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void Prim(AMGraph G, char u){ for(int j=0;j<G.vexnum-1;j++) { int min=MaxInt,t=0,s=LocateVex(G,u); for(int i=0;i<G.vexnum;i++) { if(G.arcs[s][i]<min) { min=G.arcs[s][i]; t=i; } } G.arcs[t][s]=MaxInt; cout<<u<<"->"<<G.vexs[t]<<endl; u=G.vexs[t]; } } 测试用例 查看上次提交 提交本题作答 概览 题目列表 提交列表 排名 2025编程5-图 JN jn
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值