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. 如何在mac上安装gradle

    首先,先download最新版本的gradle,网址如下:http://www.gradle.org/get-started然后将下载下来的zip包放在你要安装的路径上,我安装在/usr/local/ ...

  2. [4]Telerik Grid 简单使用方法

    1.columns <% Html.Telerik().Grid(Model) .Name("Orders") .Columns(columns => { //绑定列名 ...

  3. [转]Nginx+ThinkPHP不支持PathInfo的解决办法

    FROM : http://www.4wei.cn/archives/1001174 应集团要求,公司的服务器全收到集团机房统一管理了,失去了服务器的管理配置权限. 杯具就此开始. 首先要解决文件大小 ...

  4. max_allowed_packet自动恢复

    https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html http://blog.chinaunix.net/uid-20304801 ...

  5. 实践SQLServer Tuning

    已有的系统业务数据属性多,表之间关系紧密.单表数据量(5481 row(s) affected)级别(其中三四个主表),其他表数据量较小. 0)使用set statistics生成辅助信息参考. se ...

  6. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  7. eclipse系列: Cannot change version of project facet Dynamic web的解决方法

    问题描述         用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servl ...

  8. [CareerCup] 12.4 Test a Webpage 测试一个网页

    12.4 How would you load test a webpage without using any test tools? 这道题问我们如何不用任何测试工具来加载测试一个网页.加载测试可 ...

  9. LeetCode 笔记21 生成第k个排列

    题目是这样的: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all ...

  10. MVC5 + EF6 + Bootstrap3 (12) 新建数据

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-create.html 系列教程:MVC5 + EF6 + ...