最小生成树------Prim算法
定义:设G=(V,E)是一个无向连通图。如果G的生成子图T=(V,E’)是一棵树,则称T是G的一棵生成树(Spanning Tree)。

应用生成树可以得到关于一个电网的一组独立的回路方程。第一步是要得到这个电网的一棵生成树。设B是那些不在生成树中的电网的边的集合,从B中取出一条边添加到这生成树上就生成一个环。从B中取出不同的边就生成不同的环。把克希霍夫(Kirchoff)第二定律用到每一个环上,就得到一个回路方程。用这种方法所得到的环是独立的(即这些环中没有一个可以用那些剩下的环的线性组合来得到),这是因为每一个环包含一条从B中取来的边(生成树固定的情况下),而这条边不包含在任何其它的环中。因此,这样所得的这组回路方程也是独立的。可以证明,通过一次取B中的一条边放进所产生的生成树中而得到的这些环组成一个环基,从而这图中所有其它的环都能够用这个基中的这些环的线性组合构造出来。
生成树在其它方面也有广泛的应用。一种重要的应用是由生成树的性质所产生的,这一性质是,生成树是G的这样一个最小子图T,它使得V(T)=V(G)且T
连通并具有最少的边数。任何一个具有n个结点的连通图都必须至少有n-1条边,而所有具有n-1条边的n结点连通图都是树。如果G的结点代表城市,边代表连接两个城市的可能的交通线,则连接这n个城市所需要的最少交通线是n-l条。G的那些生成树代表所有可行的选择。
下面举个例子具体说明:
Prim最小生成树算法
line void Prim(edge[],COST[][],int n,&T[][],int minCOST) {
//edge()是G的边集。COST(n,n)是n结点图G的成本邻接矩阵,矩阵元素COST(i,j)是一个正实数,如果不存在边(i,j),则为+∞。计算一棵最小生成树并把它作为一个集合存放到数组T(1..n-1,2)中。(T(i,1),T(i,2))是最小成本生成树的一条边。最小成本生成树的总成本最后赋给minCOST。
float COST[n,n];float minCOST;
int near[],n,i,j,k,m,T[n-][];
(k,m) = 具有最小成本的边;
minCOST=COST(k,m);
(T(,),T(,)) = (k,m)
for(i=;i=n;++i) {//将near置初值
if(COST(i,m)<COST(i,k)) near[i]=m;
else { near[i]=k;};//if
};//for
near[k]=near[m]= for(i=;i<=n-;++i) { //找T的其余n-2条边
设j是near(j)≠0且COST[j][near[j]]最小的下标
(T(i,),T(i,))=(j,near[j]);
minCOST = minCOST + COST[j][near[j]];
near[j]=;
for(k=;k<=n;++k) { //修改near
if((near[k]!= && COST[k][near[k]])>COST[k][j])
{near[k]=j;
};//if
};//for
};//for
if(minCOST)→∞) { print(‘no spanning tree’)};//if
}//Prim
函数过程Prim所需要的时间是Θ(n2),其中n是图G的结点数。具体分析如下:第3行花费Θ(e) 时间,其中e=|E|。而第4行花费Θ(1)时间;第6~9行的循环花费Θ(n)时间;第12行和第16~20行的循环要求Θ(n)时间,因此第11~21行的循环的每一次选代要花费Θ(n)时间。所以这个循环的总时间是Θ(n2)。故过程Prim有Θ(n2)的时间复杂度。
因为最小生成树包含了与每个结点v相关的一条最小成本边,因此还可以把这算法稍许加快一点。为此,假设T是图G=(V,E)的最小成本生成树。设v是T中的任一结点。又设(v,w)是所有v相关的边中具有最小成本的一条边。假定(v,w)不属于E(T),且对于所有的边(v,x)∈E(T),COST(v,w)<COST(v,x)。把(v,w)包含到T中就生成一个唯一的环。这个环必定包括一条边(v,x),x≠w。从E(T) ∪{(v,w)}中去掉边(v,x)就破坏了这个环而且没有使图(v,E(T)∪{(v,w)}-{(v,x)})不连通,因此该图也是一棵生成树。由于COST(v,w)<COST(v,x),所以这棵生成树比T有更小的成本。这与T是G中最小成本生成树相矛盾。故T包含如上所述的那样的最小成本边。
最小生成树------Prim算法的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 最小生成树——prim算法
prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 求最小生成树(Prim算法)(1075)
Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n ...
随机推荐
- Zabbix探索:工作时间的设置
默认情况下,Zabbix的工作时间是启用的. 启用后,图形的北京在工作时间内就是白底的,否则就是灰底的. 今天纠结了半天,因为无论如何都是灰底的. 后来连接到服务器上一看,靠,忘记同步时间了,所以刚好 ...
- 《转》高级Unix命令
原文链接:http://coolshell.cn/articles/1044.html 在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好.Do one thi ...
- 用JDK自带的工具生成客户端调用Webservice的代码
JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使 ...
- [原]《打造未来的Java》视频笔记
[Date]2013-09-28 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.Java7新特性 1 ...
- 【Hadoop代码笔记】通过JobClient对Jobtracker的调用详细了解Hadoop RPC
Hadoop的各个服务间,客户端和服务间的交互采用RPC方式.关于这种机制介绍的资源很多,也不难理解,这里不做背景介绍.只是尝试从Jobclient向JobTracker提交作业这个最简单的客户端服务 ...
- 【poj2891】Strange Way to Express Integers
题意: 给出n个模方程x=a(mod r) 求x的最小解 题解: 这就是个线性模方程组的模版题- - 但是有一些要注意的地方 extgcd算出来的解x可能负数 要让x=(x%mo+mo)%mo 而且 ...
- Hadoop MapReduce概念学习系列之mr程序详谈(二十三)
这个暂时,没写好. K1,v1 这是增强的for循环. for(Sting w : words) { } 迭代器里,前面,放的是什么类型,后面,迭代的是谁.
- hdoj 2032 杨辉三角
杨辉三角 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- iOS中几种定时器 - 控制了时间,就控制了一切
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...
- 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】
Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...