C++Prim最小生成树算法

C++最小生成树(kruskal算法,prim算法) 生成树是一种特殊的连通子图,它在保持图中所有顶点的同时,只包含了构成一棵树的边数,即n-1条边,其中n是图中的顶点数量。生成树是无环的,并且是连通的,这意味着通过生成树可以从任何一个顶点到达其他任何顶点,而不需要回溯或形成环路。权值最小的生成树称为最小生成树。 阅读详情

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P114 算法5.7
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份

6 10
1 2 10
1 4 30
1 5 45
2 3 50
2 5 40
2 6 25
3 5 35
3 6 15
4 6 20
5 6 55

结点数6 边数10
顶点1 顶点2 权值

6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6

#include<iostream>
#include<fstream>
using namespace std;

#define MAX 8//最大顶点数
#define MAXCOST 0x7fffffff

int COST[MAX][MAX];
int NEAR[MAX];
void FindMinCost(int COST[][MAX],int n, int &k,int &l)
{
    int min = COST[1][1];
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            if (min > COST[i][j]) 
            {
                min = COST[i][j];
                k = i;
                l = j;
            }
        }
    }
}
void Prim(int COST[][MAX],int n,int T[][2], int &mincost)
{
    int k, l,i,j;
    //寻找最小成本的边
    FindMinCost(COST,n,k,l);
    mincost = COST[k][l];
    T[1][1] = k, T[1][2] = l;
    cout << "V" << T[1][1] << "->V" << T[1][2] << " COST=" << COST[k][l] << " Total=" << mincost << endl;

    for (i = 1; i <= n; i++)
    {
        if (COST[i][l] < COST[i][k])
            NEAR[i] = l;
        else
            NEAR[i] = k;
    }

    NEAR[k] = NEAR[l] =0;
    NEAR[0] = 0;

    for (i = 2; i <= n - 1; i++)
    {
        //寻找满足条件的j
        j = 0;
        for (int index = 1; index <= n; index++)
        {
            if (NEAR[index] != 0&&COST[index][NEAR[index]]<COST[j][NEAR[j]])
            {
                j = index;
            }
        }

        T[i][1] = j;
        T[i][2] = NEAR[j];
        mincost = mincost + COST[j][NEAR[j]];
        cout << "V" << T[i][1] << "->V" << T[i][2] <<" COST="<< COST[j][NEAR[j]]<<" Total="<<mincost<< endl;
        NEAR[j] = 0;

        for (k = 1; k <= n; k++)
        {
            if (NEAR[k] != 0 && COST[k][NEAR[k]] > COST[k][j])
                NEAR[k] = j;
        }
    }

    if (mincost >= MAXCOST)
        cout << "NO SPANNING TREE\n";
}
int main()
{
    int i, j, k, m, n,cost;
    ifstream in("input.txt");
    in >> m >> n;//m=顶点的个数,n=边的个数
    //初始化图G
    for (i = 0; i <= m; i++)
    {
        for (j = 0; j <= m; j++)
        {
            COST[i][j] = MAXCOST;
        }
    }
    //构建图G
    for (k = 1; k <= n; k++)
    {
        in >> i >> j >> cost;
        COST[i][j] = cost;
        COST[j][i] = cost;
    }

    //求解最小生成树
    int t[MAX][2], mincost=MAXCOST;
    Prim(COST, m,t,mincost);

    //输出最小权值和
    cout << "最小权值和=" << mincost << endl;
    system("pause");
    return 0;
}

运行结果
C++Prim最小生成树算法运行结果1
C++Prim最小生成树算法运行结果2

Prim算法求最小生成树的c++代码实现 Prim算法是求解最小生成树的常用方法,它的思想非常简单,讲所有的点集合V分为 已经放入最小生成树集合的S和未放入的V-S,每次在V-S中选择一个距离S最近的点放入到S中,直到所有的点都放入S。就是很简单的贪心策略,不过可以证明是全局最优,prim算法对于稠密图效果比较好,具体步骤可以看点击打开链接,讲解的很清楚。 对于上面的图,显然最小生成树的结果应该是{1,3,6,2,4,5}或者{1, 阅读详情

相关推荐

C++最小生成树Prim算法

#include &lt;iostream&gt; #include&lt;climits&gt; #include&lt;vector&gt; #include&lt;windows.h&gt; #define inf 0x3fffffff using namespace std; int n; int prim(int &amp;v0, vector&lt; vector&lt;int&gt...

夏洛克福尔摩斯 1076

C++:【算法】最小生成树问题

在图论问题中有这样一类问题:就是问题(适用于无向图)。简单来说,就是。针对这类问题的不同情况,有三种解决方法:简要说明以下,n为点数,m为边数。很显然,,而。但是由于堆优化Prim太复杂且其时间复杂度和Kruskal一样,所以来解决。因此这里对于堆优化的Prim就不做讲解了。下面重点说说朴素Prim和Kruskal。

qq_73176808的博客 773

C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)

边权:图中每条边的权重(Weight),可以代表实际问题中的成本、距离、时间、容量等量化指标。边权之和:对于一个子图(如生成树),将其中所有边的权重相加得到的总和。“边权之和最小” 是最小生成树的核心目标,它要求在连通所有顶点的无环子图中,选择边权总和最小的方案。这一概念在实际问题中对应 “最小成本连接所有节点”,通过经典算法可高效求解,是图论中优化问题的基础应用之一。

SmartGridequation的博客 1755

Prim算法求最小生成树(C++代码)

【代码】Prim算法求最小生成树(C++代码)

weixin_53986026的博客 948

c++实现最小生成树prim算法

#include <iostream> using namespace std; #define MAXVEX 9 //最大顶点数 #define INFINITY 65535 //极大值 即无穷 typedef struct { string vexs[MAXVEX]; //顶点表 int arc[MAXVEX][MAXVEX]; //邻接矩阵,可看做边表 int numNodes, numEdges; // 图中当前的顶点数和边数 }MG...

qq_53152049的博客 964

最小生成树,Prim,Kruskal算法主要思想,证明及C++实现

最小生成树: 任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通).加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.最小代价生成树是其所有生成树中代价最小的生成树。 实现最小生成树的算法常用的是Prim,Kruskal学校数据结构的书上讲解了这两大算法的思路及用C++实现,但关于其合理性的证明却略过去了,这里主要加上我自己的一些总结,证明一下,最后写个模版用。 P

/ 9479

最小生成树Prim算法详解(C++)

最小生成树Prim算法详解(C++)

weixin_60401853的博客 3020

C++实现Prim算法构建最小生成树

在图论中,最小生成树问题是一个经典的计算问题,其目标是找到一个无环连通子图,也就是所谓的树,在给定的加权连通图中,这个树连接了图中所有的顶点,并且其边的权值总和最小。数学上可以这样描述:给定一个带权的连通无向图G,寻找一个包含G所有顶点的树,使得这棵树的所有边的权值之和最小。这样的树被称为最小生成树。在图G=(V,E)中,V代表顶点集,E代表边集,每一条边(u,v)都有一个非负的权值w(u,v)。最小生成树T=(V,E’)是一个无环的子图,包含V中的所有顶点,并且边集E’中的边有着最小的权值总和。

weixin_35751412的博客 1110

Prim算法(C++)

需要注意的是,Prim算法要求构成的图必须是连通的。若原图不连通,则需要对每个连通分量分别运行Prim算法。此外,Prim算法的时间复杂度为O(E*logV),其中E为边数,V为顶点数。Prim算法是一种用于解决最小生成树问题的贪心算法。该算法的主要思想是从一个顶点开始,不断向图中添加边,直到构成一棵包含所有顶点的生成树,使得树的边权之和最小。2. 若生成树中已经包含所有顶点,则算法结束;否则,从与生成树相邻的所有边中选择一条边权最小的边,将其加入生成树中。3. 重复步骤2,直到生成树包含所有顶点。

qq_74156152的博客 882

掌握最小生成树:Prim与Kruskal算法C++实现

最小生成树是图论中的一个重要概念,在解决网络设计和优化问题时具有广泛的应用。所谓最小生成树,是指在一个加权无向图中找到一个子图,该子图包含图中所有顶点,并且边的权值之和最小。理解最小生成树的概念对于掌握后续章节中将要讨论的Prim算法和Kruskal算法至关重要。最小生成树的定义简单明了:对于一个具有N个顶点的连通加权无向图,其最小生成树是一棵包含所有N个顶点的树,且所有边的权重之和最小。最小生成树具有以下性质:最小生成树包含图中所有的顶点。最小生成树是一棵树,即不存在环。

weixin_35935514的博客 888

Ansys-结构动力学分析-圆柱斜齿轮模态分析学习心得

模态分析的步骤基本一直,不同点在于选择什么单元类型,模型,节点约束等 圆柱斜齿轮模态分析的难点在于圆柱斜齿轮的模型建立,和所要约束的节点的选择。 用命令流方法建立齿轮模型效率较高,当然,在ansys里建立复杂的模型实在不敢恭维,对于自下而上建模,需要知道每个关键点的坐标位置。下图是创建圆柱斜齿轮模型的命令流方式。 模型不同使用的数据也就不同了。 对于施加约束的问题这就必须要熟悉select e...

weixin_45385183的博客 1831

C++蓝白点思想Prim算法(最小生成树 - 懒猫老师)

全网最全、最详细、最易懂、简洁且强大的C++版本Prim算法(普里姆算法),普利姆算法采用的是蓝白点思想,比集合的说法更要形象。

不负AC不负卿的博客 4546

百度API实现人流量数量检测(动态)

百度的这个API还挺好用的,对与不追求高精度的人来说非常适用,结合他官方给的文档,极易上手。 需要做的就是通过API Key和Secret Key获取的access_token。 然后稍微修改下代码就行,但是他给的代码并没有直接从摄像头获取视频,而是读取一个文件夹,那么就需要自己先对摄像头的输出视频进行处理。 识别结果如下,"person_num"是当前画面的人数,in是累计进入的人数,out是累计走出去的人数。 他这个有个缺点就是返回值里边并没有实时返回in和out的值,而是都是0,但是这个图片上有,图片

qq_42479987的博客 3380

C++ 最小生成树之Prim算法

一、思路: 和Kruscal类似,先从一个顶点u出发,找u的邻接顶点v,如果(u,v)权值最小且v顶点不在生成树顶点集合中(防止出现回路),则把边(u,v)存到最小生成树中;否则该顶点已经在生成树顶点集合中,舍弃该边,找权值次小的另一条边。然后,从顶点v出发,找下一条不会出现回路的边(v,w)。直到找到n-1条边。 1.假如从顶点A出发,找A的邻接顶点(不在生成树顶...

ChanJose的博客 3346

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 923

华大HC32F460 ADC+DMA高效数据采集实战解析

本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。

weixin_29189373的博客 177

数据结构C++——最小生成树之Prim算法和Kruskal算法

数据结构C++——最小生成树之Prim算法和Kruskal算法 文章目录数据结构C++——最小生成树之Prim算法和Kruskal算法一、最小生成树的基本概念二、最小生成树之Prim算法①Prim算法的实现原理②Prim算法中的Min函数的实现③Prim算法的代码实现④测试的完整代码三、最小生成树之Kruskal算法①Kruskal算法的实现原理②Krusal算法的代码实现③测试的完整代码四、总结 一、最小生成树的基本概念 最小生成树: 在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树称为该连通网

qq_54162207的博客 8319

IC 笔试真题之吾见——华为实习(1)

前言 今天(2022 04 07)刚建立了一个专栏《IC真题之吾见》,准备记录一些IC真题的见解,为以后找工作做一点准备。 刷题绝不是目的,以题代练,以题代学。 题目来自师兄申请 华为实习“设计”岗位 的笔试真题。 见解大部分来自自己学习的理解,也有部分超纲知识是网络检索得到,希望可以多多在评论区留言交流,共同进步! 有问题的地方也希望可以直接批评指正! 后面也会同步更新此专栏! 1、下列有关时序分析的描述正确的是() A. recovery时间,是指异步控制信号在有效时钟沿到达之后必须保持

记录所学,分享知识,结识挚友 8637

C++实现的Prim算法(最小生成树)

1. 最小生成树 是一个在给定的无向图G(V,E)中求出一棵树T,使得这棵树拥有图G中的所有有顶点,且所有边都是来自于图G中的边,并且满足这棵树的边权之和是最小的 对于最小生成树需要掌握以下三个性质: ① 最小生成树是树,因此其边数是等于顶点数减1,而且树内一定不会有环 ② 对于给定的图G(V,E)其最小生成树可以是不唯一的,但是边权这个是唯一的 ③ 由于最小生成树是在无向图中产生的,所...

二哈 1万+

绿盾用户使用看图软件每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看

Win10专业版绿盾控制台7.0看图软件FastStone Image Viewer。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1202

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

最小生成树之Prim算法C++实现

Prim算法的基本思路: 将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。 #include using namespace std; i

nt13的专栏 9404

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

922

最小生成树之Kruskal和Prim算法——C++实现

很久以前就学过最小生成树之Kruskal和Prim算法,这两个算法很容易理解,但实现起来并不那么容易。最近学习了并查集算法,得知并查集可以用于实现上述两个算法后,我自己动手实现了最小生成树算法。 宏观上讲,Kruskal算法就是一个合并的过程,而Prim算法是一个吞并的过程,另外在Prim算法中还用到了一种数据结构——优先级队列,用于动态排序。由于这两个算法很容易理解,在此不再赘述。接下来给出我

疯狂的指针的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

图论算法:最小生成树——Prim算法和Kruskal算法C++实现

前言:        这次我记录的是另外一种很有意思的东西——最小生成树。相信学过离散数学的朋友都对这种东西不陌生,那么在代码中,我们该如何实现它呢?接下来,我将对此讲解一些自己的心得。        开头让我插入一个Github传送门:JZX555的Github原理:      首先让我们看看什么是最小生成树——一个有n个节点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个节点,并且...

weixin_41427400的博客 2820

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++Prim算法求最小生成树

C++Prim算法求最小生成树 MGraph.h #pragma once #include<iostream> #include<vector> #include<string> using namespace std; constexpr auto Infinity = 63353; class MGraph { public: MGraph() = default; ~MGraph() = default; void CreateMGraph() { c

weixin_50019806的博客 2205
上一篇: C++带有期限和效益的单位时间的作业排序贪心算法JS
下一篇: C++Kruskal算法
小英雄Dui
博客等级 码龄11年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值