最小生成树 贪心算法思想
来源:互联网 发布:知恒这个名字咋样 编辑:程序博客网 时间:2024/05/17 00:00
最小生成树:
任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通).加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.最小代价生成树是其所有生成树中代价最小的生成树。
实现最小生成树的算法常用的是Prim,Kruskal学校数据结构的书上讲解了这两大算法的思路及用C++实现,但关于其合理性的证明却略过去了,这里主要加上我自己的一些总结,证明一下,最后写个模版用。
Prim
基本思想:
1.在图G=(V, E)(V表示顶点,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。
2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。
3. 重复2,直到U=V为止。
这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生成树。
用书上的图来举例...懒得画直接拍了
关键是每一步选取的边起点是已加入集合U中的点,终点是未加入集合U中的点,在所有这样的点中选取权值最小的一条,把未加入U的点加入U,这一条边加入树T上.
对于这一贪心策略的证明:
首先,一定有一个最优解包含了权值最小的边e_0(prim的第一步),因为如果不是这样,那么最优的解不包含e_0,把e_0加进去会形成一个环,任意去掉环里比e_0权值大的一条边,这样就构造了更优的一个解,矛盾.
用归纳法,假设prim的前k步选出来的边e_0,…, e_k-1是最优解的一部分,用类似的方法证明prim的方法选出的e_k一定也能构造出最优解。
Kruskal
基本思想:
假设WN=(V,{E})是一个含有n个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含n个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有n棵树的一个森林。之后,从网的边集E中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有n-1条边为止。
同样用书上的图...
贪心策略的证明:
如果按Kruskal算法加入的边(u,v)在某一最优解T中不包含,那么T+(u,v)一定有且只有一个环,而且至少有一条边(u'.v')的权值大于等于(u,v).删除该边后,得到新树T'=T+(u,v)-(u',v')不会比T差,所以按Kruskal算法加入的边是最优的.
- 最小生成树 贪心算法思想
- 最小生成树-(贪心思想)
- 最小生成树Prim算法(贪心算法)
- 贪心算法 - 最小生成树 Prim算法
- 贪心算法 - 最小生成树 Kruskal算法
- 贪心算法 - 最小生成树 Kruskal算法
- 贪心算法 - 最小生成树 Prim算法
- 贪心算法和最小生成树
- 贪心算法——最小生成树
- 贪心算法之最小生成树Kruskal
- 贪心算法——最小生成树
- 贪心的kruskal最小生成树算法
- 贪心算法之Prim最小生成树
- 最小生成树prim算法(贪心)
- 最小生成树(贪心算法)
- 贪心:普里姆算法(最小生成树)
- 贪心-最小生成树
- 经典算法6:贪心算法之最小生成树
- oracle--索引,视图,同义词
- 3
- OpenCL入门一
- Dubbox 环境搭建
- 笔记本电脑清除BIOS密码
- 最小生成树 贪心算法思想
- GIS二次开发-多个shp文件的加载(两种方法)
- HDU-1166 敌兵布阵 (线段树 入门题 点修改 区间查询)
- sql中类似switch case语句的用法
- 指针初步说明小结(C++学习笔记)
- coursera Machine Learning 第四周 测验quiz答案解析 Neural Networks: Representation
- Java编程使用C3P0连接Mysql数据库(十二)
- dubbo中的group与version的简单示例
- spring的学习-common-logging搭配log4j配置项目日志