prim最小生成树
prim和DIjkstra相似,都使用了贪心策略,加一些限制条件。
prim每次会找出尽量小的那个边,将其加入到树中,最终使得生成树长大。
树中有n-1个节点时或者剩下的所有边都是INF,算法结束。
(如果剩下的所有边都是INF, 那么最小生成树不存在)。
我们这里使用邻接矩阵来实现prim算法。
初始化:
定义dist[]数组,保存每个节点到树的最小距离,当节点在树中时更新为0。
先找到一个根节点A,将其加入树中, dist[A] = 0
(1)从还没加入到树中的节点中选择一条到树距离最短的i,将其加入树中:
dist[i] = 0
(2)节点 i 加入树可能导致其他节点到树的最短距离改变,所以我们对与 i 节点相连的并且不在树中的节点最短距离进行更新
如果G[i][j] < dist[j]
dist[j] = G[i][j]
(3)循环直到找出了n-1条边或者剩下的边中都是INF,算法结束。
typedef int Vertex; typedef int Weight; typedef struct MyGraph
{
int v, e;
Weight g[MaxVertexNum][MaxVertexNum];
}MyGraph; void Prim(MyGraph& G, Vertex u)
{
int dist[G.v]; //初始化
for(int i = ; i < G.v; i++)
{
if(G.g[u][i] == -)
dist[i] = INF;
else
dist[i] = G.g[u][i];
} int count = ;
for(; count < G.v; count++)
{
int mmin = INF;
int k = -;
//找到最小距离
for(int i = ; i < G.v; i++)
{
if(dist[i] != && mmin > dist[i])
{
mmin = dist[i];
k = i;
}
}
//若找不到则代表不能得到生成树
if(k == -)
return false; //将最小节点加入
dist[k] = ;
count++;
//更新dist数组
for(int i = ; i < G.v; i++)
{
if(dist[i] != && dist[i] > G.g[k][i])
dist[i] = G.g[k][i];
}
} }
prim最小生成树的更多相关文章
- Prim 最小生成树算法
Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法.和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm). P ...
- dijkstra(最短路)和Prim(最小生成树)下的堆优化
dijkstra(最短路)和Prim(最小生成树)下的堆优化 最小堆: down(i)[向下调整]:从第k层的点i开始向下操作,第k层的点与第k+1层的点(如果有)进行值大小的判断,如果父节点的值大于 ...
- 【POJ 2485】Highways(Prim最小生成树)
题目 Prim算法:任选一个点,加入集合,找出和它最近的点,加入集合,然后用加入集合的点去更新其它点的最近距离......这题求最小生成树最大的边,于是每次更新一下最大边. #include < ...
- POJ 2485 Highways (prim最小生成树)
对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...
- Prim最小生成树板子
普里姆算法可以称为"加点法",每次迭代选择代价最小的边对应的点,加入到最小生成树中.算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点. 邻接矩阵存图 时间复杂度O(n^2 ...
- HDU4081 Qin Shi Huang's National Road System【prim最小生成树+枚举】
先求出最小生成树,然后枚举树上的边,对于每条边"分别"找出这条割边形成的两个块中点权最大的两个 1.因为结果是A/B.A的变化会引起B的变化,两个制约.无法直接贪心出最大的A/B. ...
- poj_1258 prim最小生成树
题目大意 给定N个点,以及每两个点之间的路径长度,求出一个连接这N个点的方案,使得连接这N个点的总长度最短,求出该总长度. 题目分析 求最小生成树MST的模板题,直接使用prim算法进行求解. 实现( ...
- Poj 2421 Constructing Roads(Prim 最小生成树)
题意:有几个村庄,要修最短的路,使得这几个村庄连通.但是现在已经有了几条路,求在已有路径上还要修至少多长的路. 分析:用Prim求最小生成树,将已有路径的长度置为0,由于0是最小的长度,所以一定会被P ...
- Poj(2421),Prim最小生成树
题目链接:http://poj.org/problem?id=2421 最小生成树的变形,有的村庄已经连接了,就直接把他们的权值赋为0,一样的做最小生成树,Prim算法. #include <s ...
随机推荐
- Linux nfs使用krb5的方式安全挂载
配置安全的网络nfs文件共享服务 由于本人是使用的rhce模拟考试环境来做的本题目,所以文中说到的实验脚本和评分脚本,以及krb5.keytab文件只有我本套环境独有,如果自己做练习可以不去使用实验脚 ...
- 关于element-ui resetFields
上周换到新项目组,依然是vue,不过是搭配element-ui. 这两天开始用el-form,发现了个问题. 就是我的表单确定提交之后,需要重置表单,一开始我没看熟API,直接将form对象手动赋成初 ...
- adduser与useradd的区别
问题:使用 useradd 创建用户,发现 /home 目录下没有自动创建关于用户的目录.所以做了一番调查研究 useradd是一个linux命令,但是它提供了很多参数在用户使用的时候根据自己的需要进 ...
- Odoo domain 中的 like, ilike, =like, =ilike
Odoo domain 中的 like, ilike, =like, =ilike 举例说明[转] Odoo domain 中的 like, ilike, =like, =ilike Odoo d ...
- Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException
Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. M ...
- chrome小书签-实用的小功能-javascript代码段
1.打印页面的所有脚本引用文件及代码段: javascript:var scriptarray=document.getElementsByTagName("script");fo ...
- php的运行原理、cgi对比fastcgi以及php-cgi和php-fpm之间的联系区别
最近项目中本地测试环境遇到了windows环境下的nginx使用file_get_contents/curl访问php文件导致的阻塞问题,一直在找解决的方案,这个问题研究了三天终于找到了解决方案,特别 ...
- 《C++实践之路.pdf》源码
> 源码下载方法 < >> 打开微信 >> 扫描下方二维码 >> 关注林哥私房菜 >> 输入对应编号获取百度网盘提取密码 全书源码[已更新完 ...
- [基础篇] 01_MySQL的安装与配置
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...