Prim最小生成树板子
普里姆算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。
邻接矩阵存图 时间复杂度O(n^2)
1.算法过程描述
给出一个无向图G=<V,E>
- 图的所有顶点集合为V;分成两个集合 初始令集合U= {s} , V'=V−U;
- 在两个集合U,V'能够组成的边中,选择一条代价最小的边(u0,v0)( u0∈U,v0∈V'),加入到最小生成树中,并把v0并入到集合U中。
- 重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。
由于不断向集合U中加点,所以最小代价边必须同步更新;需要建立一个辅助数组lowcost,用来维护集合V'中每个顶点与集合U中最小代价边信息
2.算法实现
#include<bits/stdc++.h>
using namespace std;
const int maxn= 1e4+;
const double eps= 1e-;
const int inf = 0x3f3f3f3f;
const int mod =;
typedef long long ll;
typedef long double ld;
int g[maxn][maxn];
int mst[maxn];
int lowcost[maxn];
int n,m;
int prim(int x) //从x点开始扩展
{
int sum=; //边权和
for(int i=;i<=n;i++)
{
lowcost[i]=g[x][i]; //lowcost[i]表示以i为终点的边中最小的权值,等于-1 表示已在集合U中
//mst[i]=x; //记录路径的话 开个mst数组 mst[i]=x;表示当前集合U中到点的距离最小的点为x 即边(x,i)为候选边
}
lowcost[x]=-;
for(int i=;i<=n-;i++)
{
int mind=inf,minid=;
for(int j=;j<=n;j++)
{
if(lowcost[j]<mind&&lowcost[j]!=-)
{
mind=lowcost[j]; //选出最小值(要加入最小生成树的边的边权)
minid=j; //记录要加入的点
}
}
sum+=mind;
lowcost[minid]=-;
for(int i=;i<=n;i++)
{
if(lowcost[i]>g[minid][i]) //更新候选值
{
lowcost[i]=g[minid][i];
}
}
}
return sum; //返回最小生成树边权值和
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF) //n个点,m条边
{
for(int i=; i<=n; i++) //赋初值
{
for(int j=; j<=n; j++)
g[i][j]=inf;
}
int u,v,w;
for(int i=;i<m;i++)
{
scanf("%d %d %d",&u,&v,&w);
g[u][v]=g[v][u]=w;
}
int sum=prim();
printf("%d\n",sum);
}
}
相关 裸题 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1212
3.简单证明prim算法
反证法:假设prim生成的不是最小生成树
1).设prim生成的树为G0
2).假设存在Gmin使得cost(Gmin)<cost(G0) 则在Gmin中存在<u,v>不属于G0
3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)
4).这与prim每次生成最短边矛盾
5).故假设不成立,命题得证.
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最小生成树
prim和DIjkstra相似,都使用了贪心策略,加一些限制条件. prim每次会找出尽量小的那个边,将其加入到树中,最终使得生成树长大. 树中有n-1个节点时或者剩下的所有边都是INF,算法结束. ...
- 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 ...
随机推荐
- VR、AR、MR定义区别
近日, 获得谷歌5亿美元融资的技术公司Magic Leap在WSJD展会中放出了一段实录视频,引起不小骚动.如今,也有媒体称他们为MR公司,那么VR.AR.MR之间到底有什么区别呢. VR.AR.MR ...
- FormData自定义上传图片
由于前段时间的项目中 涉及到图纸的上传 前端大神很随意的扔给我一个页面 让我自己修修改改 找了好几个素材站都没有找到合适的上传插件 最后不得已 用formdata 写了一个 顺便记录下吧 html 代 ...
- Oracle数据库部分迁至闪存存储方案
Oracle数据库部分迁至闪存存储方案 1.实施需求 2.确认迁移表空间信息 3.确认redo信息 4.确认undo信息 5.表空间迁移到闪存 6.redo迁移到闪存 7.undo迁移到闪存 8.备库 ...
- windows日志监控
bat脚本,主要作用,每个五分钟读取日文本件中新增内容,进行错误赛选,如果有错误信息,将错误信息用邮件发送给管理员. 其中awk和sed需要手动下载 :读取number.txt文档,获取上一次执行时文 ...
- CPP--正码,反码,补码~附整数溢出的探讨
之前说到了long的争议(http://www.cnblogs.com/dotnetcrazy/p/8059210.html),这边就不用long来举例了,用int吧 可以看一下这篇文章(http:/ ...
- Netty-Websocket 根据URL路由,分发机制的实现
最近在做netty整合websocket,发现网上很多项目都是最简单的demo,单例的一个项目. 然而公司的项目需要接受几个不同功能的ws协议消息,因此最好是用URL来区分,让页面上采用不同的链接方式 ...
- Java基础之引用(String,char[],Integer)总结
1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer ...
- C# 字符串的连接
1.利用 "+"(加号)运算符: string str = "Hello"+ "World": console.WriteLine(str) ...
- Ruby学习之代码块
代码块在其他的语言中都或多或少接触过一些,如perl中sort{$a<=>$b}keys,传入代码块实现按数值排序,在swift中用到闭包,更加深入学习到training closure. ...
- 【HTML初识】
一.BS模式 BS(Browser-Server)模式:顾名思义为浏览器-服务器的意思,对比的话类似我们PC上面浏览器使用的产品即为BS模式产品,例如google doc.各类网站等. 服务端开启一个 ...