树(自由树)、无序树和有根树

     自由树就是一个无回路的连通图(没有确定根)(在自由树中选定一顶点做根,则成为一棵通常的树)。
     从根开始,为每个顶点(在树中通常称作结点)的孩子规定从左到右的次序,则它就成为一棵有序树
     在图的应用中,我们常常需要求给定图的一个子图,使该子图是一棵树。

生成树

1、生成树
     如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树(SpanningTree)。
     生成树是连通图的包含图中的所有顶点的极小连通子图。
     图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。

2、深度优先生成树和广度优先生成树
(1)生成树的求解方法
     设图G=(V,E)是一个具有n个顶点的连通图。则从G的任一顶点(源点)出发,作一次深度优先搜索(广度优先搜索),搜索到的n个顶点和搜索过程中从一个已访问过的顶点vi搜索到一个未曾访问过的邻接点vj,所经过的边(vi,vj)(共n-1条)组成的极小连通子图就是生成树。(源点是生成树的根)
     通常,由深度优先搜索得到的生成树称为深度优先生成树,简称为DFS生成树;由广度优先搜索得到的生成树称为广度优先生成树,简称为BPS生成树。
  
(2)求DFS生成树和BFS生成树算法
    只要在DFS(或DFSM)算法的if语句中,在递归调用语句之前加入适当生成边(vi,vj)的操作(如将该边输出或保存),即可得到求DFS生成树的算法。
    在BFS(或BFSM)算法的if语句中,加入生成树边(vi,vj)的操作,可得到求BFS生成树的算法。【参见练习】
  注意:
    ①图的广度优先生成树的树高不会超过该图其它生成树的高度
    ②图的生成树不惟一,从不同的顶点出发进行遍历,可以得到不同的生成树。

3、生成树的通用定义
    若从图的某顶点出发,可以系统地访问到图中所有顶点,则遍历时经过的边和图的所有顶点所构成的子图,称作该图的生成树。(此定义不仅仅适用于无向图,对有向图同样适用。)
(1)若G是强连通的有向图,则从其中任一顶点v出发,都可以访问遍G中的所有顶点,从而得到以v为根的生成树。
(2)若G是有根的有向图,设根为v,则从根v出发可以完成对G的遍历,得到G的以v为根的生成树。
(3)若G是非连通的无向图,则要若干次从外部调用DFS(或BFS)算法,才能完成对G的遍历。每一次外部调用,只能访问到G的一个连通分量的顶点集,这些顶点和遍历时所经过的边构成了该连通分量的一棵DFS(或BPS)生成树。G的各个连通分量的DFS(或BFS)生成树组成了G的DFS(或BFS)生成森林。
(4)若G是非强连通的有向图,且源点又不是有向图的根,则遍历时一般也只能得到该有向图的生成森林。

5、普里姆(Prim)算法
(1)算法思想
     T=(U,TE)是存放MST的集合。
  ①T的初值是({r},¢)
    即最小生成树初始时只有一个红点r,没有红边。
  ②T经过n-1次如下步骤操作,最后得到一棵含n个顶点,n-1条边的最小生成树
     ⒈选择紫边集中一条轻边并扩充进T
  ⒉将轻边连接的蓝点改红点
  ⒊将轻边改红边
     ⒋修改紫边集

(2)较小紫边集的构造
     若当前形成的T中有k个顶点,|U|=k,|V-u|=n-k,故可能的紫边数目是k(n-k)。从如此大的紫边集中选择轻边是低效的。因此,必须构造较小的紫边集。
     对于每个蓝点v ∈V-U,从v到各红点的紫边中,只有最短的那一条才有可能是轻边。因此,只须保留所有n-k个蓝点所关联的最短紫边作为轻边的候选集即可。

(3)候选紫边集合的修改
     当把轻边(u,v)扩充到T时,因为v由蓝变红,故对每个剩余的蓝点j,边(v,j)就由非紫边变为紫边,这条新紫边的长度可能小于蓝点j原来所关联的最短紫边的长度。因此,用长度更小的新紫边取代那些原有的最短紫边。

(4)Prim算法的伪代码描述
 PrimMST(G,T,r){
  //求图G的以r为根的MST,结果放在T=(U,TE)中
    InitCandidateSet(…);//初始化:设置初始的轻边候选集,并置T=({r},¢)
    for(k=0;k<n-1;k++){ //求T的n-1条树边
        (u,v)=SelectLiShtEdge(…);//选取轻边(u,v);
         T←T∪{(u,v)};//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U
        ModifyCandidateSet(…); //根据新红点v调整候选轻边集
      } 
   }

(5) 算法的执行过程
     用PRIM算法得到最小生成树的过程【参见动画演示

注意:
     若候选轻边集中的轻边不止一条,可任选其中的一条扩充到T中。
     连通网的最小生成树不一定是惟一的,但它们的权相等。
     
(6)算法特点
     该算法的特点是当前形成的集合T始终是一棵树。将T中U和TE分别看作红点和红边集,V-U看作蓝点集。算法的每一步均是在连接红、蓝点集的紫边中选择一条轻边扩充进T中。MST性质保证了此边是安全的。T从任意的根r开始,并逐渐生长直至U=V,即T包含了 C中所有的顶点为止。MST性质确保此时的T是G的一棵MST。因为每次添加的边是使树中的权尽可能小,因此这是一种"贪心"的策略。
(7)算法分析
     该算法的时间复杂度为O(n2)。与图中边数无关,该算法适合于稠密图。

(1)算法思想
  ①T的初始状态
       只有n个顶点而无边的森林T=(V,¢ )
  ②按边长递增的顺序选择E中的n-1安全边(u,v)并加入T,生成MST
注意:
     安全边指两个端点分别是森林T里两棵树中的顶点的边。加入安全边,可将森林中的两棵树连接成一棵更大的树
     因为每一次添加到T中的边均是当前权值最小的安全边,MST性质也能保证最终的T是一棵最小生成树。

(2)算法特点
     该算法的特点是:当前形成的集合T除最后的结果外,始终是一个森林。

(3)Kruskal算法的抽象描述
  KruskalMST(G){//求连通网G的一棵MST
     T=(V,¢); //初始化,T是只含n个顶点不包含边的森林
    依权值的递增序对E(G)中的边排序,并设结果在E[0..e-1]中
    for(i=0;i<e;i++) { //e为图中边总数
        取E[0..e-1)中的第i条边(u,v);
         if u和v分别属于T中两棵不同的树then
            T=T∪{(u,v)};//(u,v)是安全边,将其加入T中
         if T已是一棵生成树then
      ``         return T;
        }//endfor
       return T;
   }

(4)用Kruskal算法构造最小生成树的过程
     用Kruskal算法构造最小生成树的过程【参见动画演示

(5)算法分析
     该算法的时间复杂度为O(elge)。
    Kruskal算法的时间主要取决于边数。它较适合于稀疏图。

文自:http://blog.csdn.net/heavenboya/article/details/6654778

图--生成树和最小生成树.RP的更多相关文章

  1. K:图相关的最小生成树(MST)

    相关介绍:  根据树的特性可知,连通图的生成树是图的极小连通子图,它包含图中的全部顶点,但只有构成一棵树的边:生成树又是图的极大无回路子图,它的边集是关联图中的所有顶点而又没有形成回路的边.  一个有 ...

  2. 图结构练习——最小生成树(kruskal算法(克鲁斯卡尔))

    图结构练习——最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  有n个城市,其中有些城市之间可以修建公路,修建不同的公 ...

  3. 图结构练习——最小生成树(prim算法(普里姆))

      图结构练习——最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  有n个城市,其中有些城市之间可以修建公路,修建不同 ...

  4. 瓶颈生成树与最小生成树 POJ 2395 Out of Hay

    百度百科:瓶颈生成树 瓶颈生成树 :无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的.瓶颈生成树的值为T中最大权值边的权. 无向图的最小生成树一定是瓶颈生成树,但瓶 ...

  5. 利用并查集求最大生成树和最小生成树(nlogn)

    hdu1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. POJ-3026(图上的最小生成树+prim算法+gets函数使用)

    Borg Maze POJ-3026 一开始看到这题是没有思路的,看了题解才知道和最小生成树有关系. 题目的意思是每次走到一个A或者S就可以分为多个部分继续进行搜索.这里就可以看出是从该点分出去的不同 ...

  7. P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P5540 题目大意 给出\(n\)个点\(m\)条边边权是一个二元组\((a_i,b_i)\),求出一棵生成树最小化 ...

  8. 洛谷 P5540 - [BalkanOI2011] timeismoney | 最小乘积生成树(最小生成树)

    洛谷题面传送门 大概是一个比较 trivial 的小 trick?学过了就不要忘了哦( 莫名奇妙地想到了 yyq 的"hot tea 不常有,做过了就不能再错过了" 首先看到这种二 ...

  9. SDUT图结构练习——最小生成树

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 这道题一开始是用prim算法做的,一直错一直错,后来问了帅郭改用 ...

随机推荐

  1. np.unique 的实现

    1. 简单实现 import numpy as np def unique(ar): perm = ar.argsort() aux = ar[perm] flag = np.concatenate( ...

  2. ICE的连接机制

    1.当使用ICE的proxy进行方法调用时,ICE运行环境会建立一个到服务器的连接.当proxy提供了多个endpoint时   默认的ICE运行环境选择endpoint的行为为random,可以通过 ...

  3. Spring通过XML方式实现定时任务

    package com.wisezone.service; import java.text.SimpleDateFormat; import java.util.Date; import org.s ...

  4. asp.net mvc中model注意事项

    1 modelState必须是需要在action Filter中才生效 2 发送接口的json nullable的类型必须初始化

  5. Jquery中.ajax和.post详解

    之前写过一篇<.NET MVC 异步提交和返回参数> ,里面有一些ajax的内容,但是不深入,这次详细剖析下jquery中$.ajax的用法. 首先,上代码: jquery-1.5.1 $ ...

  6. 微信小程序 报错Setting data field "variableName" to undefined is invalid.

    Setting data field "variableName" to undefined is invalid. 将数据字段“variableName”设置为未定义是无效的. ...

  7. Zabbix通过SNMPv2监控DELL服务器的硬件信息

    (一)zabbix监控DELL服务器 (1)简述:监控DELL服务器硬件一般有两种途径:1.操作系统上安装OMSA,编写脚本调用omreport命令进行监控(需要在操作系统上安装比较麻烦):2.使用i ...

  8. 框架Mockito

    一.什么是mock测试,什么是mock对象? 先来看看下面这个示例: 从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例. 一种替代方案就是使用mocks 从图 ...

  9. cassandra安装配置

    准备运行环境1.1 cassandra可以安装在windows和linux下,本例子安装在centos6.7的环境下.1.2 关闭防火墙.或者开放9042(默认的CQL本地服务端口).9160(默认的 ...

  10. linux下不用空格执行带参数的5种姿势

    在搞安全的时候经常会遇到代码/命令执行,不能用空格的情况,总结了几种的绕过方法. 1.!! [root@iZ28wg1kditZ tmp]# pwd /tmp [root@iZ28wg1kditZ t ...