6-1 最小生成树(普里姆算法) (10分)

简介: 6-1 最小生成树(普里姆算法) (10分)

6-1 最小生成树(普里姆算法) (10分)

试实现普里姆最小生成树算法。

函数接口定义:

void Prim(AMGraph G, char u);


其中 G 是基于邻接矩阵存储表示的无向图,u表示起点

裁判测试程序样例:

#include #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 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

q1.png


看到这题,我们回顾一下prim算法的思路——将小树长大直至覆盖全图


其核心算法思想就是贪心算法的思想


什么是贪?每一步都要做到最好!

什么是好?在本题就是边的权值越小越好。


结合此题我们可以分为以下几步:

1.初始化这棵树,即以v为起始点,同时初始化数组distance[]

注:distance数组表示该树的任意一点到该点的最小距离

2.从小树现有的结点出发,寻找边权值最小的点:

3.找到后输出该边

4.将该点的distance数组中的值赋值为1,标记已经遍历过

5.循环遍历结点,更新distance[]数组


void Prim( AMGraph G, char v )
    { 
        int distance[G.vexnum];
        int parent[G.vexnum];
        //记录v的下标
        int index=0;
        int i,min=MaxInt,imin,count=0;
        // 1.初始化这棵树,即以v为起始点,同时初始化数组distance[]
        //     注:distance数组表示该树的任意一点到该点的最小距离
        //寻找v的下标
        for (i = 0; i < G.vexnum; i++)
        {
            if (G.vexs[i]==v)
            {
                index=i;
            }
        }
        for (i = 0; i < G.vexnum; i++)
        {
            if (i==index)
            {
                distance[i]=0;
                parent[i]=index;
            }else
            {
                distance[i]=G.arcs[index][i];
                parent[i]=index;
            }       
        }
        while (1)
        {
            if (count==G.vexnum-1)
            {
                break;
            }
            // 2.从小树现有的结点出发,寻找边权值最小的点:
            for ( i = 0; i < G.vexnum; i++){
                if (min>distance[i]&&distance[i]!=0)
                {
                    //记录最小值及其下标
                    min=distance[i];
                    imin=i;
                }
            }
            //更新已到达过得节点数
            count++;
            // 3.找到后输出该边
            if (count<G.vexnum-1)
            {
                printf("%c->%c\n",G.vexs[parent[imin]],G.vexs[imin]);
            }else
            {
                printf("%c->%c",G.vexs[parent[imin]],G.vexs[imin]);
            }
            //初始化min以便下次寻找
            min=MaxInt;
            // 4.将该点的distance数组中的值赋值为0,标记已经遍历过
            distance[imin]=0;
            // 5.循环遍历结点,更新distance[]数组
            for ( i = 0; i < G.vexnum; i++){
                if (distance[i]!=0&&G.arcs[i][imin]<MaxInt)
                {
                    if (distance[i]>G.arcs[i][imin])
                    {
                        distance[i]=G.arcs[i][imin];
                        parent[i]=imin;
                    }                   
                }
            }            
        }
    }


说真的,太久太久没写c语言的程序了,写的极不习惯,c语言的程序调试起来还贼麻烦,几个小错误反复调了好久才找到,着实不容易啊。写个函数题就花了我两小时,唉。。。。。。。


记录点滴,乐于分享,转载请注明出处

愿我们以梦为马,不负人生韶华。

我们追梦在路上!

愿与君共勉!


相关文章
普里姆算法
## 应用场景-修路问题 有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通,各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? 思路: 将10条边,连接即可,但是总的里程数不是最小. 正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少.
|
存储 算法
数据结构例程——最小生成树的普里姆算法
本文是[数据结构基础系列(7):图]中第11课时[最小生成树的普里姆算法]的例程。 (程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…) #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; #include "graph.h" void Prim(MGraph g,int v) { i
1264 0
|
算法 关系型数据库 索引
普里姆算法介绍
普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法。 基本思想 对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。
1447 0
|
8月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
729 0
|
8月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
451 2
|
9月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
262 6
|
9月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
373 3
|
8月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
351 8
|
8月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
407 8