zoukankan      html  css  js  c++  java
  • 面试问题之数据结构与算法:最小生成树算法

    最小生成树算法有:Kruskal算法和Prim算法。

    关于图的几个概念:

    连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。

    强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。

    连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接两个顶点的代价,称这种连通图叫做连通网。

    生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。(一棵有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。)

    最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

    一、Kruskal克鲁斯卡尔算法

      克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到生成一棵最小生成树。

      克鲁斯卡尔算法的执行步骤:

      第一步:在带权连通图中,将边的权值排序;

      第二步:判断是否需要选择这条边(此时图中的边已按权值从小到大排好序)。判断的依据是边的两个顶点是否已连通,如果连通则继续下一条;如果不连通那么就选择使其连通。

      第三步:循环第二步,直到图中所有的顶点都在同一个连通分量中,即得到最小生成树。

    二、Prim普利姆算法

      普利姆算法的核心思想是:从任意一个顶点出发将该顶点加入顶点集U并解锁相邻的边,并找到满足得到最小生成树的那条最小的边,将该边的另一个顶点加入顶点集U并继续解锁相邻的边,直到所有顶点加入顶点集U生成一棵最小生成树。

      普利姆算法的执行步骤:

      第一步:选择图中某一顶点开始,加入顶点集U,并解锁相邻的所有边

      第二步:从解锁边中选择满足条件的一条权值最小的边,将新的顶点加入顶点集U;

      第三步:循环第二步,直到所有顶点加入顶点集。

  • 相关阅读:
    sys:1: RuntimeWarning: coroutine 'Launcher.killChrome' was never awaited
    python 引用对象相等,还是用list.extend()
    python 3.7.4 垃圾,一整天安装那个mitmproxy ,不行,卡在一个破库叫urwid ,说是os.path()为空,换3.8.2安装成功,垃圾3.7.4迟早要完
    python @staticmethod 注解,静态方法,可以省略类里那个self参数
    spring boot 记一次花了两天还是没有解决的奇怪bug(失去所有响应,post不到了,啥反应也没有了)
    Yum常用命令
    Centos安装与配置
    遍历hashmap的6种方法
    Java定时调度
    ElasticSearch的应用
  • 原文地址:https://www.cnblogs.com/yichengming/p/11469454.html
Copyright © 2011-2022 走看看