0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Prim算法以及优化实现

算法与数据结构 来源:未知 作者:邓佳佳 2018-03-31 10:32 次阅读

最小生成树(Minimum Spanning Trees),简称MST。是图论中一个非常重要的概念。解决这个问题有两种算法,今天暂且先来讨论一下Prim Algorithm。不做特别说明,讨论的都是无向图。

首先介绍一下最小生成树的概念,我们知道,图可以这样定义 G=(V,E) ,其中 G 表示图,V 表示顶点集合,E 表示边集合。最小生成树是这样一棵树,它满足:

通俗地讲,就是使得图GG连通时,所选取的边的长度的和最小。

如上图,加粗的路径就是在最小生成树上的路径。

算法讲解:

现在,我们开始讨论Prim Algorithm。这个算法可以分为下面几个步骤:

将顶点集 V 分成两个集合 A 和 B,其中集合 A 表示目前已经在MST中的顶点,而集合 B 则表示目前不在 MST 中的顶点。

寻找与集合 A 连通的最短的边 (u,v),将这条边加入最小生成树中。(此时,与(u,v) 相连的顶点,不妨设为 Bi,也应加入集合 A 中)重复第二步,直至集合 B 为空集。

算法的大体思想就是这样了。为了方便理解,我们先来看一下下面一张图片:

对照上面的图片,想必对于Prim Algorithm也有了一定的理解。

下面我们来设计算法,显然,我们需要遍历集合 A 中所有顶点及与之相连的边,取连接到集合B的权值最小的边,加入最小生成树。这样一来,复杂度将达到 O(n3)。

我们可以对这个想法进行优化。我们维护一 pCost[i] 数组,用来表示从集合A到与之相邻的节点的最小费用。这样,我们只要每次取这个数组中的最小值,把它在集合B中所对应的结点Vi加入到集合A中。

每次加入结束以后,都要更新pCost[i]数组。即枚举所有与结点Vi相连的边,判断是否比pCost[i]数组中的最小费用小,如果比它小,则更新。这样可以将算法优化到O(n2)。

代码如下:

#include

#include

#include

using namespace std;

const int MAX = 1024;

const int INF = 2147483647;// 设置最大权值

int N, M;

vector > pMap[MAX];// 邻接表

void Prim();

int main()

{

cin >> N >> M;

for(int i = 1; i <= M; i++)

{

int u, v, w;

cin >> u >> v >> w;

pMap[u].push_back(make_pair(v, w));

pMap[v].push_back(make_pair(u, w));

}

Prim();

return 0;

}

void Prim()

{

int nCost = 0;

vector pMST;// 储存MST的结点

int pCost[MAX];// 储存与集合A相邻的顶点的最小权值,0表示该结点已经在MST中

pMST.push_back(1);// 将结点1加入MST

pCost[1] = 0;

for(int i = 2; i <= N; i++)// 初始化,切记要将除1以外的都置为INF

{ pCost[i] = INF; }

for(int i = 0; i < pMap[1].size(); i++)// 处理与结点1相连的顶点

{ pCost[pMap[1][i].first] = pMap[1][i].second; }

for(int i = 1; i <= N - 1; i++)// 剩余N-1个顶点,循环N-1次

{

int nVertex = 0, nWeight = INF;// 用于寻找最短的边

for(int j = 1; j <= N; j++)

{

if(nWeight > pCost[j] && pCost[j] != 0)

{

nVertex = j;

nWeight = pCost[j];

}

}

pCost[nVertex] = 0;

pMST.push_back(nVertex);// 将节点nVertex加入MST

nCost += nWeight;// 计算MST的费用

for(int j = 0; j < pMap[nVertex].size(); j++)// 更新pCost数组

{

if(pCost[pMap[nVertex][j].first] != 0 &&

pCost[pMap[nVertex][j].first] > pMap[nVertex][j].second)

{

pCost[pMap[nVertex][j].first] = pMap[nVertex][j].second;

}

}

}

cout << "MST Cost is " << nCost << endl;

cout << "The vertexs in MST are ";

for(int i = 0; i < pMST.size(); i++)

{ cout << pMST[i] << " "; } 

cout << endl;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4599

    浏览量

    92641
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80846

原文标题:Prim 算法及其高效实现

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA芯片用于神经网络算法优化的设计实现方案

    前言 AI芯片(这里只谈FPGA芯片用于神经网络加速)的优化主要有三个方面:算法优化,编译器优化以及硬件
    的头像 发表于 09-29 11:36 4856次阅读
    FPGA芯片用于神经网络<b class='flag-5'>算法</b><b class='flag-5'>优化</b>的设计<b class='flag-5'>实现</b>方案

    定点算法实现优化

    TDSDM642是TI公司推出的定点DSP芯片,具有性价比高、运算速度快的优点,但是定点DSP对于浮点运算比较困难,因此在系统实现时需要对算法进行浮点到定点的移植。同时,为了使DSP上的代码获得
    发表于 04-18 10:54

    【TL6748 DSP申请】基于DSP的目标跟踪算法研究及优化实现

    申请理由:本人为北工大的研究生,专业为DSP与嵌入式系统。熟悉DSP和某些图像算法。现在课题在研究跟踪算法以及优化实现,所以想申请次开发板!
    发表于 09-09 16:59

    请问如何实现优化算法编程?

    什么是Viterbi算法?目标处理器是什么?如何实现优化算法编程?
    发表于 04-27 06:58

    粒子群算法城镇能源优化调度问题

    computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数
    发表于 07-07 06:04

    果蝇优化算法MATLAB实现

    果蝇优化算法MATLAB实现发布时间:2018-10-12 23:28,浏览次数:1183, 标签:MATLAB果蝇优化算法--Matlab
    发表于 08-17 07:28

    果蝇优化算法MATLAB实现过程是怎样的?

    果蝇优化算法MATLAB实现过程是怎样的?
    发表于 11-22 07:48

    智能优化算法及其应用_王凌著

    本书系统地叙述模拟退火算法、遗传算法、禁忌搜索、神经网络优化算法、混沌优化、混合优化策略等智能
    发表于 10-10 16:23 0次下载

    基于FPGA的SM3算法优化设计与实现

    基于FPGA的SM3算法优化设计与实现的论文
    发表于 10-29 17:16 5次下载

    SVPWM算法优化及其FPGA_CPLD实现

    SVPWM算法优化及其FPGA_CPLD实现
    发表于 04-13 15:42 18次下载

    FPGA信号处理算法设计、实现以及优化(南京)

    利用FPGA实现信号处理算法是一个难度颇高的应用,不仅涉及到对信号处理算法、FPGA芯片和开发工具的学习,还意味着要改变传统利用软件在DSP上实现
    发表于 12-26 17:26 12次下载

    基于DM642的H.264编码算法优化实现

    基于DM642的H.264编码算法优化实现
    发表于 05-18 09:22 1次下载

    DM6446的车牌定位快速算法实现优化

    DM6446的车牌定位快速算法实现优化
    发表于 10-26 15:27 1次下载
    DM6446的车牌定位快速<b class='flag-5'>算法</b><b class='flag-5'>实现</b>与<b class='flag-5'>优化</b>

    基于Prim初始种群选取优化遗传算法的三维片上网络低功耗映射

    的优势,将计算任务合理地分配到各个网络节点,对于优化三维片上网络功耗和散热等问题具有很高的效率。通过仿真实验,对所提出的基于Prim算法的改进GA与基本GA的3D NoC映射算法进行了
    发表于 12-07 14:40 0次下载
    基于<b class='flag-5'>Prim</b>初始种群选取<b class='flag-5'>优化</b>遗传<b class='flag-5'>算法</b>的三维片上网络低功耗映射

    一文详细了解Prim最小生成树算法

    像图论算法这种高级算法虽然不算难,但是阅读量普遍比较低,我本来是不想写 Prim 算法的,但考虑到算法知识结构的完整性,我还是想把
    的头像 发表于 03-16 15:27 2837次阅读