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. css继承性和不继承的属性。

    在CSS中并不是所有的属性都是能够继承的,因此在使用时一定要了解哪些是能够继承的哪些是不能够继承的.visibility和cursor能够被所有元素继承:letter-spacing,word-spa ...

  2. 【有奖】NOIP普及组模拟赛 个人邀请赛 乐多赛

    题目描述 日本数学家角谷有一个猜想:任意一个自然数,经过以下过程,最终会得到1.现在请你打印出任意一个数使用角谷猜想转换为1需要几次. 演变方式: 1.如果这个数为奇数,则将它×3+1.如果这个数为偶 ...

  3. 最短路径—Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  4. WPF基础——Application

    一.Application介绍 WPF中的Application对象用来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.WPF App ...

  5. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  6. Nginx支持连接数的问题

    据网上有人说nginx的配置中: nginx支持的最大连接数与以下因素有关: worker_processes ; events { worker_connections ; } ulimit -a ...

  7. Linux 删除文件夹和文件命令

    inux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字-r 就是 ...

  8. Windows Phone & Windows App应用程序崩溃crash信息抓取方法

    最近有用户反馈,应用有崩溃的情况,可是本地调试却无法重现问题,理所当然的,我想到了微软的开发者仪表盘,可以查看一段时间内的carsh记录,不过仪表盘生成carsh记录不是实时的,而且生成的报告查看非常 ...

  9. web性能优化之:no-cache与must-revalidate深入探究

    引言 稍微了解HTTP协议的前端同学,相比对Cache-Control不会感到陌生,性能优化时经常都会跟它打交道. 常见的值有有private.public.no-store.no-cache.mus ...

  10. ASP.NET MVC Controller Session问题

    发现问题 最近在项目中遇到这样一个问题,一直没办法重现,所以几天都没有解决. 测试那边给出的问题是这样的:每天早上来的时候,第一次通过单点登录到系统的时候,总会跳转回登录界面,再次登录就好了.当时给我 ...