第十三周项目1—Prim算法的

本文详细阐述了Prim算法的验证过程,通过测试用图展示了算法的运行结果,并对算法进行了知识点总结。

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

/*
* Copyright (c)2015,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:项目1.cbp
* 作    者:张晗
* 完成日期:2015年12月4日
* 版 本 号:v1.0


* 问题描述:Prim算法的验证。


* 输入描述:无
* 程序输出:测试数据
*/


 

#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;
}


测试用图:

运行结果:

知识点总结:

Prim算法的验证。

### 山东大学实验十三 Prim算法教程 #### 实验背景介绍 山东大学的数据结构课程中,实验十三专注于最小生成树的构建,特别是通过Prim算法来解决这一问题。该实验旨在帮助学生理解如何利用贪心策略有效地找到加权无向图中的最小生成树。 #### Prim算法概述 Prim算法是一种用于寻找给定连通有权重无向图G=(V,E)的一棵最小生成树的方法[^2]。此方法始于任意选定的一个顶点v,并逐步扩展至覆盖整个图形的所有节点。具体来说,在每次迭代过程中都会挑选连接当前已知部分(即已经加入到正在生长的树内的那些结点组成的集合U)与其他剩余未访问过的结点之间的最短路径上的边作为新的成员纳入最终形成的MST之中,直至所有顶点都被囊括进来为止。 #### C语言实现细节 为了便于编程实践,可以定义一个`vertexnode`结构体用来表示邻接表中的每一个元素,它包含了指向另一个相邻顶点的信息以及对应的权重值: ```c++ struct vertexnode { int weight; int element; vertexnode* next; vertexnode() {} vertexnode(int elem, int wt):element(elem), weight(wt), next(nullptr){} }; ``` 接着初始化阶段设置初始状态为仅包含源点s在内的子集S={s};对于每一轮循环而言,程序会从未处理完毕的部分选取距离最近的那个新顶点u添加进现有集合内,并更新其关联的所有可能成为候选者的边列表。当完成n-1轮这样的操作之后就得到了完整的最小生成树T=(V,TE)[^5]。 #### 输入输出说明 根据题目描述,输入文件的第一行为两个正整数n和e分别指示网络中有多少个站点及它们间存在几条直接相连线路;随后跟着的是有关这些连线的具体情况记录——每一行给出三个数值i,j,w意味着编号分别为i和j两处地方之间存在着一条长度等于w的道路[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值