最小生成树之prime算法实现

最小生成树-prime算法 Prime算法的核心步骤是:在带权连通图中V是包含所有顶点的集合, U已经在最小生成树中的节点,从图中任意某一顶点v开始,此时集合U={v},重复执行下述操作:在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边,将(u,w)这条边加入到已找到边的集合,并且将点w加入到集合U中,当U=V时,就找到了这颗最小生成树。        其实,算法的核心步骤就是:在所有u∈U,w∈V-U 阅读详情

prime算法的精髓在于:

每次选取一条边。

该边满足:1、一端已选,一端未选;2、该边权值最小。

直到选取n-1条边或选取n个顶点算法结束,求出MST或者判断出不存在MST。

 

代码设计:

1、利用两个集合存放已选顶点和未选顶点

(choosed[]存放已选顶点,unchoosed[]存放未选顶点)

2、每次选取的边都是一端在choosed[]中,另一端在unchoosed[]中的权值最小的边

3、利用STL中vector可以方便的实现图的临界表存储

4、记录组成MST的每条边很方便,只要在选取到一条满足条件的边时记录下起点、终点、权值即可

 

代码:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int maxn=101;    //顶点数 
const int INF=0x7fffffff;

struct edge  //边 
{
    int to;    //到达的点 
    int cost;  //边的花费 
    bool flag; //是否入选 
};

int choosed[maxn];      //已选顶点 
int unchoosed[maxn];    //未选顶点 
int nodeNum,edgeNum,MST;  //顶点数、边数、最小生成树 
bool choose[maxn];     //顶点是否已选 
vector<edge> myV[maxn];  //图的邻接表 

/* 
  //这是无向图有重复边的建图,取重复边中最小的边存储 
bool exist(int from,int to,int cost)
{
    bool existFlag=false,smallFlag=false;
    
    for(int i=0;i<myV[from].size();i++)
    {
        if(myV[from][i].to==to)
        {
            existFlag=true;
            
            if(myV[from][i].cost>cost)
            {
                smallFlag=true;
                myV[from][i].cost=cost;
                break;
            }
        }
    }
    
    if(smallFlag)
    {
        for(int j=0;j<myV[to].size();j++)
        {
            if(myV[to][j].to==from)
            {
                myV[to][j].cost=cost;
                break;
            }
        }
    }
    
    if(existFlag) return true;
    return false;
}
             
void storeMap()   //邻接表存图 
{
    for(int j=0;j<maxn;j++)  //清空 
    {
        myV[j].clear();
    }
    
    memset(choose,false,sizeof(choose));  //标志图的各个点是否被选,不能重复 
    
    int from,to,cost,num=0;  //从from到to花费cost的边 
    
    for(int i=0;i<edgeNum;i++)
    {
        scanf("%d%d%d",&from,&to,&cost);
        
        //把图上的所有点不重复的放到unchoosed[]表中
        if(!choose[from])
        {
            unchoosed[num++]=from;
            choose[from]=true;
        }
        if(!choose[to])
        {
            unchoosed[num++]=to;
            choose[to]=true;
        }              
        
        if(!exist(from,to,cost))  //图中存在重复边的处理 
        {
            edge tmp;
            
            tmp.flag=false;
            tmp.cost=cost;
            
            //无向图 
            tmp.to=to;
            myV[from].push_back(tmp);
            
            tmp.to=from;
            myV[to].push_back(tmp);
        }
    }
}
*/
//无向图,无重复边的建图 
void storeMap()   //邻接表存图 
{
    for(int j=0;j<maxn;j++)  //清空 
    {
        myV[j].clear();
    }
    
    memset(choose,false,sizeof(choose));  //标志图的各个点是否被选,不能重复 
    
    int from,to,cost,num=0;  //从from到to花费cost的边 
    
    for(int i=0;i<edgeNum;i++)
    {
        scanf("%d%d%d",&from,&to,&cost);
        
        //把图上的所有点不重复的放到unchoosed[]表中
        if(!choose[from])
        {
            unchoosed[num++]=from;
            choose[from]=true;
        }
        if(!choose[to])
        {
            unchoosed[num++]=to;
            choose[to]=true;
        }              
        
        edge tmp;  
        tmp.flag=false;
        tmp.cost=cost;
            
        //无向图 
        tmp.to=to;
        myV[from].push_back(tmp);
            
        tmp.to=from;
        myV[to].push_back(tmp);
    }
}
 
void prime()  //prime算法 
{
    //初始化一些信息 
    MST=0;
    memset(choose,false,sizeof(choose));
    choosed[0]=unchoosed[0];
    choose[unchoosed[0]]=true;
    
    int choosedNum=1,from,to,cost,index;
    
    while(choosedNum<nodeNum)
    {
        cost=INF;
         
        //从所有已选顶点中,找一条费用最小,且没选的边 
        for(int i=0;i<choosedNum;i++)
        {
            for(int j=0;j<myV[choosed[i]].size();j++)
            {
                edge tmp=myV[choosed[i]][j]; 
                if(!choose[tmp.to] && !tmp.flag && tmp.cost<cost)
                {
                    from=choosed[i];
                    to=tmp.to;
                    cost=tmp.cost;
                    index=j; 
                }
            }
        }
         
        myV[from][index].flag=true;  //将找到的边标志为已选 
        
        //无向图,从from->to的边已选,那么从to->from的边也已选 
        for(int k=0;k<myV[to].size();k++)
        {
            if(myV[to][k].to==from)
            {
                myV[to][k].flag=true;
                break;
            }
        }
        
        choosed[choosedNum++]=to;  //将选择的顶点放到已选点集合中 
        choose[to]=true;
        
        MST+=cost;   //最小生成树费用增加 
    }
    
    printf("%d\n",MST);
}  
      
int main()
{
    while(scanf("%d%d",&nodeNum,&edgeNum)==2)  //输入图的点数、边数 
    {
        storeMap();         

        prime();
    }
    
    system("pause");
    return 0;
} 

 

测试实例:

1、图形:

2、输入及结果:

 

问题:

如何利用prime算法求解有向图的MST?

先留在这吧。。。大笑

 

 

 

 


 

prime算法-最小生成树算法 Prime算法  分类: 算法总结2011-08-15 18:05 5363人阅读 评论(2) 收藏 举报 算法 普利姆(Prime)算法(只与顶点相关)   算法描述: 普利姆算法求最小生成树时候,和边数无关,只和定点的数量相关,所以适合求稠密网的最小生成树,时间复杂度为O(n*n)。 算法过程: 1.将一个图的顶点分为两部分,一部 阅读详情

相关推荐

JAVA中Prime算法的原理和实现

Prime算法:是一种穷举查找算法来从一个连通图中构造一棵最小生成树。利用始终找到与当前树中节点权重最小的边,找到节点,加到最小生成树的节点集合中,直至所有节点都包括其中,这样就构成了一棵最小生成树。prime在算法中属于贪心算法的一种,贪心算法还有:Kruskal、Dijkstra以及哈夫曼树及编码算法。下面具体讲一下prime算法:1、首先需要构造一颗最小生成树,以及两个节点之间的权重数组,在此

Mr_洛先森 3465

最小生成树prim算法C语言 实验报告,最小生成树-普利姆(Prim)算法

1. 最小生成树(又名:最小权重生成树)概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树。最小生成树属于一种树形结构(树形结构是一种特殊的图),或者说是直链型结构,因为当n个点相连,且路径和最短,那么将它们相连的路一定是n-1条。可以利用参考一个问题理解最小生成树,有n个村庄,每个村庄之间距离不同,要求村庄之间修路,每一个村庄必须与任意一个村庄联通,如何...

weixin_32747681的博客 1951

最小生成树的创建(Prime普利姆算法、java实现)

文章目录前言一、什么是最小生成树?二、Prime算法简述1.文字描述2.图文演示三、代码实现总结 前言 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,我们可以选择将n个城市当成n个节点,然后将所有的节点相连接形成一个连通图,边上的数字代表与边相邻的两座城市之间铺设光纤的费用(权),但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。 下面我们就将 A B C D E F G五座城市形成的带权连通图

weixin_52939031的博客 2289

数据结构实验之图论九:最小生成树(prime队列优化版)

【代码】数据结构实验之图论九:最小生成树(prime队列优化版)

m0_73673533的博客 109

最小生成树——prime算法

最小生成树的prime算法是以点为核心来进行计算. 原理:从一个点开始遍历它到其他所有点的距离,无法直接到达的距离为INF,记录为mindis数组 如:一共有四个点ABCD 五条边 A——B 2; A——C 1; A——D 3; B——C 4; C——D 2; 选取A为第一个点,那么mindis数组中的值为0,2,1,3;...

lalala445566的博客 1194

<算法与数据结构>详解贪心策略之最小生成树的Prime算法的设计与实现

🎉每个不曾起舞的日子都是对生命的辜负 🎉写在前面 最小生成树的问题还是比较热门的,最经典的莫过于Prime算法和Kruskal算法了,这篇博文我会详细讲解Prime算法的设计思想与具体代码的实现,不要求数据结构学的有多好,只要跟着我的思路来,一步一步的分析,调试,终能成就自己,那就让我们开始吧! 浅析最小生成树 设G=(V,E)是无向连通带权图。E中每条边(v,w)的权为c[v][w]。 生成树:如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。 耗费:生成树上各边权的总和

叶落秋白的博客 3855

最小生成树prim算法C语言 实验报告,数据结构之---C语言实现最小生成树之prim(普里姆)算法...

//最小生成树之Prim算法//杨鑫#include #include #define n 6#define MaxNum 10000 /*定义一个最大整数*//*定义邻接矩阵类型*/typedef int adjmatrix[n + 1][n + 1]; /*0号单元没用*/typedef struct{int fromvex, tovex; //生成树的起点和终点int wei...

weixin_42514877的博客 545

数据结构实验报告9-图-Prim算法求最小生成树-实验内容与要求.docx

用字符文件提供数据建立连通带权网络邻接矩阵存储¬¬结构。编写程序,用Prim算法求一棵最小生成树。要求输出最小生成树的各条边(用顶点无序偶表示)、各条边上的权值、最小生成树所有边上的权值之和。

数据结构 图论03 最小生成树Prime算法

普利姆「Prime」算法 1.要点 找出已连接顶点为基础的下一个权值最小的边 2.图解 (1)以A点为起始点,找出已连接顶点{'A'}为基础的下一个权值最小的边(且不指向已经连接的顶点) A -> B = 3 ,B 点,将 B 点添加至已连接的顶点 connetedVertices{'A','B'} 。 (2)找出已连接顶点 {'A','B'} 为基础的下一个权值最小的边(且不指向已经连接的顶点) B -> C = 2 ,将 C 点添加到已连接的顶点 connetedVertice

半亩方糖 900

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4577

智能工厂四大系统协同实战:ERP/PLM/MES/WMS集成架构与数据流解析

本文深入解析了智能工厂中ERP、PLM、MES、WMS四大核心系统的协同集成架构与数据流。通过实战案例,阐述了如何打通系统孤岛,实现从产品设计、资源计划、生产执行到仓储物流的数据无缝流转,从而构建高效、敏捷的智能工厂运营体系。

ujm567890的博客 676

《算法4》加权无向图最小生成树算法(Prime算法(延时实现) | Prime算法(即时实现) | Kruskal)

《算法4》最小生成树3种算法原理:Prime算法(延时实现):将mst里面顶点的邻接边集合的最小边加入最小生成树mst,并延迟删除2个顶点都已经标记的边;Prime算法(即时实现):距离最近的顶点加到最小生成树mst里面,并修改距离w顶点到最小生成树mst的的距离;Kruskal:将邻接边集合的最小边加入最小生成树mst,加入的边不形成环(union-find并查集算法检测); 各种最小生成树算法的性能特点 demo中使用的测试数据,来自《算法4》,配图这里有个小的错误,看的时候注意一下。 .

小小绿豆的专栏 478

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案)

本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。

hadoop5ranger的博客 1152

最小生成树之prime算法(邻接矩阵实现)

文章目录(一)prime算法1.1 使用邻接矩阵存图 (一)prime算法 1.1 使用邻接矩阵存图 #include<iostream> #include<cstring> using namespace std; #define N 1000 #define INF 0x3f3f3f3f int mp[N][N]; //使用邻接矩阵存图; int dis[N]; ...

专注技术 5389

遥感卫星影像AI数据集格式规范详解、技术原理与数据生产全流程技术手册

本技术手册旨在系统性地梳理遥感卫星影像AI数据集的各类格式标准(涵盖VOC、COCO、YOLO及遥感专用DOTA格式等),深入剖析其背后的技术原理,并详细阐述数据生产的全过程,涵盖预处理、标注、质量控制及数据增强等关键环节。无论您是刚入门的算法工程师,还是资深的数据生产管理者,本手册都将为您提供详实的参考与指引。

panshengwu的博客 1134

深度学习-算法工程师岗位面试常见问题及解答

一、相关的问题 深度学习优化学习方法(一阶、二阶) 一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。 二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。 自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。 梯度下降陷入局部最优有什么解决

nobles007820的博客 2924

最小生成树之Prime算法(临接表+优先队列实现)

#include <iostream> #include <cstdio> #include <vector> #include <queue> #include<cstring> using namespace std; const int maxn = 105; const int inf = 0x3f3f3f3f; struct ...

专注技术 3270

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1236

图之Prime算法(邻接表)实现----最小生成树

1.prime算法思想:(只与顶点有关)prime算法求最小生成树时,和边数无关,只和顶点的数量有关,时间复杂度是O(n^2),所以呢,适合于求稠密网的最小生成树;将一个图的顶点分为两部分,一部分是最小生成树的集合,这里就记为(A集合),另一部分是未处理的顶点集合. 首先,选择一个节点,将这个节点加入A集合,然后,对集合A中的顶点遍历,找出A中顶点关联的边权值最小的点加入A集合。 不断重复第二步,直

杨龙飞的博客 3600

《YOLO11魔术师专栏》专栏介绍 & 专栏目录

【原创自研模块】【多组合点优化】【注意力机制】【主干篇】【neck优化】【卷积魔改】 【block&多尺度融合结合】【损失&IOU优化】【上下采样优化】【小目标性能提升】【前沿论文分享】【训练实战篇】

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1万+

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

Prime算法实现最小生成树

#include #define INF 1000 #define MAXN 21 int n,m; int Edge[MAXN][MAXN]; int lowcost[MAXN]; int nearvex[MAXN]; void prime(int u0) { int i,j; int sumweight=0; int min=INF; int v=-1; for(i=1;i<=

I need a job 854

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

图——最小生成树实现(Kruskal算法,prime算法)

介绍最少生成树的概念及并查集的实现接着解释Kruskal算法和Prime算法的原理(配合图),并实现其代码并进行测试。

2301_80035594的博客 2430

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构 最小生成树(prime算法)

实验十四、最小生成树 1 实验目的 本实验实现最小生成树的prime算法。 2 实验内容 建立如图所示的邻接矩阵; 2)根据prime算法求其最小生成树,如从顶点A出发生成的最小生成树为: 利用前缀点数组完成记录最小生成树建立的过程 Code: #include<stdio.h> #include<stdlib.h> #define MAX_SIZE 20 ...

小胡同的诗 2526

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

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

最小生成树Prime算法

洛谷p1546链接 Prime算法的核心也是贪心,但是不同的就是,它是一直维护一颗树, 直到变成一颗最小生成树, #include<bits/stdc++.h> using namespace std; const int maxn = 110; const int inf = 0x3f3f3f3f; int maze[maxn][maxn], dis[maxn], n;//maze...

lifehappy 560

Prime(最小生成树算法)的java实现

以后打算用这个博客作为平台,记录自己的一些东西,希望自己在这两年半的时间有一些成长。 public int primeValue(int[][] a, int n) { int sum = 0; int[] lowcost = new int[n + 1];//边的最小值 int[] closest = new int[n + 1];//存储最近节点 boolean[] ...

dlzjp123的专栏 454
上一篇: 29/7/2012 ICPC培训 第十四天
下一篇: 最小生成树之kruskal算法
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值