【数据结构】 最小生成树(三)——prim算法
上一期介绍到了kruskal算法,这个算法诞生于1956年,重难点就是如何判断是否形成回路,此处要用到并查集,不会用当然会觉得难,今天介绍的prim算法在kruskal算法之后一年(即1957年)诞生,长江后浪推前浪,前浪死在沙滩上,既然后发明,那一定有很多优点吧?具体又如何用代码实现?比kruskal算法好在哪里?不用担心,小编会一一解答。
prim算法的思想:
prim算法的主要思想就是让一棵小树不断得到新的树边,直到长成所有节点都在树集合中的大树。具体做法如下:首先先得来思考,最初的小树是什么样子的?当然是初始化成一个根节点。那么这棵小树又如何长大?此时所有的节点就只有两种情况—要么已经在集合中,要么还等待选择。无论是kruskal算法,还是prim算法,都用到了贪心算法,既然是最小生成树,那就要选择最小的边,prim算法不太一样,它所选择的是已经在集合中的节点的连向未选节点所形成的边中最小权重的边,将其未选节点添加进树边集合中。明确了这两个问题,就可以想出以下步骤:
1)构造最初的待选边表:这个表包含三种元素分别是已选节点,未选节点和相连边的权值,在最初只有一个根节点,在程序实现上,多把0节点作为根节点,所以每一个已选节点赋初值为0,那么未选节点分别为1,2,3,4…,n-1,n,假设存储图的矩阵的是二维数组map,那么权值部分则是map[0][1],map[0][2],map[0][3]…map[0][n]。
2)不断循环,直到未选节点只剩最后一个:从待选边表找到一条最短边,并加入树边集合;然后修改待选边表,在树边集合中不停找出新的节点和当前的未选节点形成连边,如果这条边比原有最小值少就修改这条边。
这样最小生成树就构建完成了,接着我们来说一说代码实现方法。
代码实现:
#include<iostream>
#include<cmath>
using namespace std;
int n,map[][],k;
struct tree{ //三元结构体
int yx;
int dx;
int cost;
};
void prim()
{
int v;
tree wait[];//待选边表
for(int i=;i<=n-;i++)
{
wait[i].yx=;
wait[i].dx=i+;
wait[i].cost=map[][i+];//初始化
}
for(int i=;i<=n-;i++)//不断找到树边
{
k=i;
for(int j=i+;j<n-;j++)
if(wait[j].cost<wait[k].cost) k=j;//找到最短边
swap(wait[i],wait[k]);//交换
v=wait[i].dx;//新节点
for(int j=i+;j<n-;j++)
{
if(wait[j].cost<map[v][wait[j].dx])//修改待选边表
{
wait[j].cost=map[v][wait[j].dx];
wait[j].yx=v;
}
}
}
for(int i=;i<=n;i++)
{
cout<<wait[i].yx<<" "<<wait[i].dx<<" "<<wait[i].cost;
cout<<endl;
} }
int main()
{ cin>>n;
for(int i=;i<=n-;i++)
for(int j=;j<=n-;j++)
cin>>map[i][j];
//do something
prim();
return ;
}
正常样例图示:
//此图是从mooc上copy来的
一般情况下待选边表长这样。
Prim算法的优点:
比起kruskal算法来讲,prim算法可以不用判断是否产生回路,因为在待选边表中不停计算的过程中,可以有效避免产生回路的情况,可以不学并查集(有时还要学习堆),快速恶补,并且适用于稠密图,其时间复杂度只与节点数量有关,在特定情况下可以更快的执行完程序。
Prim算法 的缺点:
prim算法适用于稠密图,但是稀疏图还是kruskal算法更胜一筹,并且prim算法更难理解,小编现在还有点懵,写两道题就好了,下棋将会带来最小生成树例题题解。
欲知后事如何,且听下回分解……
专栏:
【数据结构】 最小生成树(一)——什么是最小生成树?
【数据结构】 最小生成树(二)——kruskal算法
【数据结构】 最小生成树(三)——prim算法
【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
【数据结构】 最小生成树(三)——prim算法的更多相关文章
- 数据结构与算法--最小生成树之Prim算法
数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...
- 最小生成树一·Prim算法
描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...
- hihocoder 1097 最小生成树一·Prim算法
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- hihocoder hiho一下 第二十六周 最小生成树一·(Prim算法)
题目1 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥 ...
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 24最小生成树之Prim算法
最小生成树的Prim算法 思想:采用子树延伸法 将顶点分成两类: 生长点——已经在生成树上的顶点 非生长点——未长到生成树上的顶点 使用待选边表: 每个非生长点在待选边表中有一条待选边,一端连着非生长 ...
- 最小生成树的Prim算法
构造最小生成树的Prim算法 假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...
- 算法学习记录-图——最小生成树之prim算法
一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边. 最小生成树:构造连通网的最小代价(最小权值)生成树. prim算法在严蔚敏树上有解释,但是都是数学语言,很 ...
- 数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)
一:Prim算法 1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...
随机推荐
- MyBatis框架的使用及源码分析(五) DefaultSqlSessionFactory和DefaultSqlSession
我们回顾<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 一文的示例 private static SqlSessionFactory getSessionF ...
- 【uva12232/hdu3461】带权并查集维护异或值
题意: 对于n个数a[0]~a[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题: I P V :告诉你a[P] = V I P Q V:告诉你a[P] XOR a ...
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- st2-045漏洞利用poc
use LWP::UserAgent; undef $/; ){print "Use:poc.pl http://target/index.action\n";exit;} my ...
- LCD 每隔10分钟 自动熄灭 --打开Framebuffer console的时候【转】
转自:http://blog.csdn.net/liujia2100/article/details/9009063 版权声明:本文为博主原创文章,未经博主允许不得转载. 之前移植LCD的时候,一切正 ...
- Oracle例外定义
例外名 ORA-XXXXX SQLCODE ACCESS_INTO_NULL ORA-06530 -6530 CASE_NOT_FOUND ORA-06592 -6592 COLLECTION_IS_ ...
- 设计模式之笔记--工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 定义 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 类图 描 ...
- STL之顺序容器 deque 动态数组
deque是一个动态数组,deque与vector非常类似,vector是一个单向开口的连续线性空间,deque则是双向开口的连续线性空间.两者唯一的区别是deque可以在数组的开头和末尾插入和删除数 ...
- nginx配置文件的详细讲解
user nginx nginx; #定义Nginx运行的用户和用户组worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数worker_rlimit_nofile ...
- Cent os FTP配置
原文:http://www.aicoffees.com/itshare/412261137.html