算法8-2:最小生成树贪婪算法

为了简化问题,我们需要作出一些假设。假设图中每条边的权重都是不一样的,假设整个图是连通的。这样假设的目的就是让最小生成树的计算结果是唯一的。

图的切割

介绍算法之前,需要先了解图的切割。图的切割就是将顶点分割成两部分,切到的边称之为交叉边。下图红色的先就是交叉边。

在最小生成树中,无论如何切割,最小生成树总是从交叉边中选择最小的一条边。下图中红色的粗边就是最小生成树上的边。

算法步骤

贪婪算法的步骤如下:

  1. 所有的边在一开始都是灰色的,最小生成树的边是黑色的。
  2. 任意选择一种切割方法,只要不切割到黑色的边即可。从被切割到的边中选择最短的一条边标记成黑色,表示这条边属于最小生成树
  3. 重复步骤2,直到黑色的边连接所有的顶点为止

贪婪算法的性能比较差,后续将会介绍kruskai算法、prim算法和boruvka,因此这里就不编写代码了。

算法8-2:最小生成树贪婪算法,布布扣,bubuko.com

时间: 2024-10-06 06:52:42

算法8-2:最小生成树贪婪算法的相关文章

算法8-6:最小生成树研究现状

目前已经介绍了Kruskal和Prim算法,他们的复杂度一个是E logE一个是E logV,那么有没有复杂度为E的算法呢?理论上是可能的,但是目前还没有发现该算法.下图是最小生成树算法的发展过程. 从图中可以看到复杂度越來越接近E. 最小生成树的应用 欧几里德最小生成树 问题描述:给定一系列点的坐标,求包含所有点的最小生成树. 下图是这个问题的一个例子. 解决这个问题的基本思想就是先将每个点都看成一个独立的cluster,每次合并一对距离最近的cluster,直到所有的点都合并在一起为止.这种

贪心算法(2)-Kruskal最小生成树

什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树其实是最小权重生成树的简称.生成树的权重是考虑到了生成树的每条边的权重的总和. 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量. Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重

算法8-1:最小生成树简介

最小生成树是图论中的一个概念.首先介绍一下什么是生成树.生成树就是将一个图中所有的顶点全部连接在一起,并且保证图中没有出现回路. 下图不是生成树,因为没有连接所有的顶点. 下图不是生成树,因为图中有回路. 像下图这样的才是生成树. 生成树的概念介绍完了.那么最小生成树的概念就比较明确了,这里的最小指的是所有的边权重之和最小. 应用 下图是美国西雅图的自行车路线图,用的是最小生成树. 下图是随机生成的最小生成树,看起来非常像大自然的产物.最小生成树在自然界中比较常见. 算法8-1:最小生成树简介

数据结构域算法系列之二 贪婪算法和人生规划

前几天和苯螃蟹聊天,谈到对未来的规划.螃蟹说自己要在5年以后做到像某大牛那样熟知一切专业知识并且做到写文章信手拈来.说完自己的,就来问我"5年内的职业规划是什么?"我其实是那种平时想事情根本不过脑子的人,怎么会整天没事琢磨5年规划?于是我老实告诉她:"我没有5年规划,我觉得只要做好自己遇到的每一件事,就自然能够通向最好的结果." 苯螃蟹听了以后大惊:"你怎么能够没有规划呢?!" 难怪苯螃蟹会惊讶万分.因为是我告诉了她读者文摘上那个关于怎样规划自己

算法练习:最小生成树 (Minimum Spanning Tree)

(注:此贴是为了回答同事提出的一个问题而匆匆写就,算法代码只求得出答案为目的,效率方面还有很大的改进空间) 最小生成树是指对于给定的带权无向图,需要生成一个总权重最小的连通图.其问题描述及算法可以详见:https://en.wikipedia.org/wiki/Minimum_spanning_tree以下我选用其中一个简单的算法描述,编写 Python 代码尝试解决此问题. 下面是同事提出的问题的原图: 程序: 1 # coding: utf-8 2 3 from sets import Se

POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14021   Accepted: 5484   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

Bor?vka 算法求 MST 最小生成树

基本思路:用定点数组记录每个子树的最近邻居.对于每一条边进行处理:如果这条边连成的两个顶点同属于一个集合,则不处理,否则检测这条边连接的两个子树,如果是连接这两个子树的最小边,则更新 (合并).时间复杂度平均 \(O(V+E)\),最坏 \(O((V+E)\log V)\). 下面是 Bor?vka 算法演示动图:(源:Wikimedia) 程序代码: struct node {int x, y, w; } edge[M]; int d[N]; // 各子树的最小连外边的权值 int e[N];

面试常规算法复习(最小生成树)

两种常规的算法. package com.company; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; class Edge { int a, b, w; Edge(int a, int b, int w){ this.a = a; this.b = b; this.w = w; } } public class Mai

最小生成树之克鲁斯卡尔(Kruskal)算法

学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路:若去掉一条边,将会使之变成非连通图. 最小生成树(Minimum Spanning Tree,MST):或者称为最小代价树Minimum-cost Spanning Tr