Prim和Kruskal求最小生成树
Prim:
算法步骤:
1.任意结点开始(不妨设为v1)构造最小生成树: 2.首先把这个结点(出发点)包括进生成树里, 3.然后在那些其一个端点已在生成树里、另一端点还未在生成树里的所有边中找出权最小的一条边, 4.并把这条边、包括不在生成树的另一端点包括进生成树, …。 5.依次类推,直至将所有结点都包括进生成树为止
Pascal的渣渣代码...
注:寻找最短的边那一步可以用堆优化,但那样还不如直接用Kruskal......
Reference: http://www.nocow.cn/index.php/Prim%E7%AE%97%E6%B3%95
const vmax=;
var
w:array[..vmax,..vmax] of longint;
i,j,k,v,e:longint;
w:存储邻接矩阵
v:结点数
e:边数 procedure prim(v0:longint);
var flag:array[..vmax] of boolean; //flag:表示是否在树中。true是, false否
min,prevk,nextk:longint;
begin
fillchar(flag,sizeof(flag),);
flag[v0]:=true; //STEP2
for i:= to v- do //最小生成树中有v-条边 ,所以外层循环需要v-次 //STEP5
begin
min:=maxlongint; for k:= to v do
if flag[k] then
//寻找在最小生成树中的点 k:当前在最小生成树中的点
for j:= to v do //STEP3
//寻找与(最小生成树中的点)的距离最短的点。
// j:当前要找的不在最小生成树中的点
if (not flag[j]) and (w[k,j]<min) and (w[k,j]<>) then
紫色代码://判重:要找的点不能在最小生成树中
红色代码://k与j必须相连!
begin
min:=w[k,j];
nextk:=j;
prevk:=k;
//这条边从在最小生成树中的点出发 ,
//扩展到当前不在最小生成树中的点。
//prevk:=k,prevk为起点,在最小生成树中
//nextk:=j,nextk为 终点,当前不在最小生成树中
end; if min<>maxlongint then
//如果找到了nextk这样的可以从当前最小生成树中扩展出来
//(可以进入最小生成树)的点
begin
flag[nextk]:=true; //将nextk这样的点加入最小生成树 //STEP4
writeln(prevk,‘ ’,nextk,‘ ’,min); //输出这条边
end;
end;
end; begin
fillchar(w,sizeof(w),);
readln(v,e);
for k:= to e do
begin
read(i,j);
readln(w[i,j]);
w[j,i]:=w[i,j];
end; prim(); //STEP1 end.
Kruskal:
算法步骤:
1、把图中的边按权值从小到大排序。 2、按从小到大的顺序依次向树中加边。 在添加每一条边(u,v)时,如果u和V两个点都已在树中,一旦添加,就回构成回路,所以放弃该边,在向后找下一条边。 3、直到添加n-1条边。
用并查集优化
#include <iostream>
using namespace std; struct abc
{
int x,y,dat;
}; struct abc e[];
int f[];
int i,j,k,ans,n,m,tx,ty,tmp; int find(int x)
{
if (x!=f[x])
f[x]=find(f[x]);
return f[x];
} void iunion(int x,int y)
{
int fx=find(x);
int fy=find(y);
if (fx!=fy)
f[fy]=fx;
} void qsort(int l,int r)
{
int i,j,mid;
struct abc t;
i=l;
j=r;
mid=e[(l+r)/].dat;
do{
while (e[i].dat<mid) i++;
while (e[j].dat>mid) j--;
if (!(i>j))
{
t=e[i];
e[i]=e[j];
e[j]=t;
i++;
j--;
}
}while (i<=j);
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
} int main()
{ cin>>n>>m;
for (i=;i<=m;i++)
{
cin>>tx>>ty>>tmp;
e[i].x=tx;
e[i].y=ty;
e[i].dat=tmp;
} for (i=;i<=n;i++)
f[i]=i;
qsort(,m); k=;
ans=;
for (i=;i<=n-;i++)
{
while (find(e[k].x)==find(e[k].y)) k++;
iunion(e[k].x,e[k].y);
ans=ans+e[k].dat;
cout<<e[k].x<<" "<<e[k].y<<" "<<e[k].dat<<endl;
} cout<<ans<<endl;
}
Prim和Kruskal求最小生成树的更多相关文章
- Kruskal求最小生成树
#include<bits/stdc++.h> using namespace std; ; ; const int inf = 0x3f3f3f3f; ; typedef long lo ...
- Codeforces 609E (Kruskal求最小生成树+树上倍增求LCA)
题面 传送门 题目大意: 给定一个无向连通带权图G,对于每条边(u,v,w)" role="presentation" style="position: rel ...
- ZOJ 1586 QS Network Kruskal求最小生成树
QS Network Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the ...
- HDU 1863 Kruskal求最小生成树
好久没写博客了写着玩的…… Kruskal这种东西离散都学过…… 一句话…… 添加当前图权值最小且构不成环的一条边 直到连接所有点…… 其他人好多Kruskal的模版 肯定有比我的好的…… 就是刷一波 ...
- hdu 1233 还是畅通project(kruskal求最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 最小生成树(prim和kruskal)
最小生成树(prim和kruskal) 最小生成树的最优子结构性质 设一个最小生成树是T.如果选出一个T中的一条边,分裂成的两个树T1,T2依然是它们的点集组成的最小生成树.这可以用反证法来证.反着来 ...
- 【图论】信手拈来的Prim,Kruskal和Dijkstra
关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最 ...
- Kruskal和Prim算法求最小生成树
Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...
- Prim算法和Kruskal算法求最小生成树
Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...
随机推荐
- 十个Flex/Air疑难杂症及解决方案简略
十个Flex/Air疑难杂症及解决方案简略 转自http://blog.sban.us/40.html 最近去一家台企,对方给我出了十道“难道”:在TileList中如果選擇檔過多,會出現捲軸,當拖動 ...
- unix基本命令日记
鉴于命令经常忘记,网站文章鱼龙混杂,很多不适合自己,现在记录方便自己查看.每个人的基础不同,需要合适的文章也不一样. 用户管理 useradd 功能说明:建立用户帐号. 语 法:useradd [-m ...
- cygwin下的vim 的vimrc配置
1.一直接照 vim 在linux的配置使用 cygwin下的 vi. vim --version 之后,出现了帮助...
- 总结Gerrit常用命令
查看分支列表,带有*的分支表示是当前所在分支[root@115~~]#git branch 查看分支详细情况 (推荐这种方式)[root@115~~]#git branch -av 创建分支(比如de ...
- laravel记录
1.使用数据库事务的时候需要传递参数,使用了use关键字,否则的话传递不进去,代码如下: public function postVote(Request $request){ $data = $re ...
- NSProgress
苹果公司在 iOS 7 and OS X 10.9引入NSProgress类,目标是建立一个标准的机制用来报告长时间运行的任务的进度.NSProgress引入之后,其最重要的作用是可以在一个app的多 ...
- 013医疗项目-模块一:加入工具类ResultUtil
这篇文章要做的就是优化,封装.把之前的代码尽量封装进类,并且不要硬编码. 在UserServiceimpl中的insertSysuser()函数之前是这么写的: ResultInfo resultIn ...
- 【转】WCF与Web API 区别(应用场景)
Web api 主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回 ...
- scrapy 爬取 useragent
useragentstring.com 网站几乎廊括了所有的User-Agent,刚学了scrapy,打算那它练手,把上面的 user-agent 爬取下来. 本文只爬取常见的 FireFox, Ch ...
- linux内核分析 第七周
一.课堂相关 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 C代码--预处理--汇编代码--目标代码--可执行文件 预处理负责把include的文件包含进来及宏替换工作. he ...