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求最小生成树的更多相关文章

  1. Kruskal求最小生成树

    #include<bits/stdc++.h> using namespace std; ; ; const int inf = 0x3f3f3f3f; ; typedef long lo ...

  2. Codeforces 609E (Kruskal求最小生成树+树上倍增求LCA)

    题面 传送门 题目大意: 给定一个无向连通带权图G,对于每条边(u,v,w)" role="presentation" style="position: rel ...

  3. ZOJ 1586 QS Network Kruskal求最小生成树

    QS Network Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the ...

  4. HDU 1863 Kruskal求最小生成树

    好久没写博客了写着玩的…… Kruskal这种东西离散都学过…… 一句话…… 添加当前图权值最小且构不成环的一条边 直到连接所有点…… 其他人好多Kruskal的模版 肯定有比我的好的…… 就是刷一波 ...

  5. hdu 1233 还是畅通project(kruskal求最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. 最小生成树(prim和kruskal)

    最小生成树(prim和kruskal) 最小生成树的最优子结构性质 设一个最小生成树是T.如果选出一个T中的一条边,分裂成的两个树T1,T2依然是它们的点集组成的最小生成树.这可以用反证法来证.反着来 ...

  7. 【图论】信手拈来的Prim,Kruskal和Dijkstra

    关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最 ...

  8. 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 思路:在保证不产生回 ...

  9. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

随机推荐

  1. maven总结1

     环境:win7   maven版本:apache-maven-3.1.1-bin.zip maven安装 1.确定已经正确安装jdk,若未安装需要先安装jdk 2.http://maven.apac ...

  2. cocoaPod相关问题

    cocoap简介: 1. 简介 CocoaPods是一个负责管理iOS项目中第三方开源代码的工具,其源码在Github上开源.使用CocoaPods可以节省设置和更新第三方开源库的时间并提高工作效率. ...

  3. 头像上传功能实现,PC端的需要做兼容

    暂时实现的效果: http://sandbox.runjs.cn/show/v2vkds3j <form action=""> <img id="vie ...

  4. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(转)

    http://www.cnblogs.com/xishuai/p/ddd-repository-iunitofwork-and-idbcontext.html 好久没写 DDD 领域驱动设计相关的文章 ...

  5. LeetCode:Unique Paths I II

    Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagra ...

  6. Linux第十一次学习笔记

    异常控制流 异常控制流(ECF)发生在计算机系统的各个层次 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序. 在操作系统层,内核通过上下文转换将控制从一个用户进程转移到另一个用户进程. 在 ...

  7. warning: LF will be replaced by CRLF

    一. Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符.这个功能的选项如下: false - 不做任何检查warn - 在提交时检查并警告t ...

  8. ios——MPMoviePlayerController截取视频缩略图 播放视频又可以截取视频缩略图

    #import <AVKit/AVKit.h>#import <MediaPlayer/MediaPlayer.h>#import "ViewController.h ...

  9. gdb调试汇编堆栈分析

    代码(src/05/gdb.c) int g(int x) { return x + 4; } int f(int x) { return g(x); } int main(void) { retur ...

  10. 20145215《Java程序设计》课程总结

    20145215<Java程序设计>课程总结 每周读书笔记链接汇总 20145215<Java程序设计>第一周学习总结 20145215<Java程序设计>第二周学 ...