面试问题之数据结构与算法:最小生成树算法
最小生成树算法有:Kruskal算法和Prim算法。
关于图的几个概念:
连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。
强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。
连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接两个顶点的代价,称这种连通图叫做连通网。
生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。(一棵有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。)
最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
一、Kruskal克鲁斯卡尔算法
克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到生成一棵最小生成树。
克鲁斯卡尔算法的执行步骤:
第一步:在带权连通图中,将边的权值排序;
第二步:判断是否需要选择这条边(此时图中的边已按权值从小到大排好序)。判断的依据是边的两个顶点是否已连通,如果连通则继续下一条;如果不连通那么就选择使其连通。
第三步:循环第二步,直到图中所有的顶点都在同一个连通分量中,即得到最小生成树。
二、Prim普利姆算法
普利姆算法的核心思想是:从任意一个顶点出发将该顶点加入顶点集U并解锁相邻的边,并找到满足得到最小生成树的那条最小的边,将该边的另一个顶点加入顶点集U并继续解锁相邻的边,直到所有顶点加入顶点集U生成一棵最小生成树。
普利姆算法的执行步骤:
第一步:选择图中某一顶点开始,加入顶点集U,并解锁相邻的所有边
第二步:从解锁边中选择满足条件的一条权值最小的边,将新的顶点加入顶点集U;
第三步:循环第二步,直到所有顶点加入顶点集。