算法记录---最小生成树【kruskal&&prim】

来源:互联网 发布:大数据用英文怎么说 编辑:程序博客网 时间:2024/05/22 17:16
生成树
给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树。
生成树不唯一
 
最小生成树:
如果边上有权值,那么使得权值和最小的生成树叫做最小生成树
构造最小生成树的准则:
1.必须使用且仅使用该网络中的n-1条边来联结网络中的 n个顶点;
2.不能使用产生回路的边;
3.各边上的权值的总和达到最小。
两种常用的构造最小生成树的方法:
1.克鲁斯卡尔算法(从边入手)
2.普里姆算法(从点入手
克鲁斯卡尔: 在剩下的所有未选取的边中,找最小边,如果不产生环(重边也算在内),就把当前这条边加入到生成树中,如果和已选取的边构成回路,则放弃,选取次小边。(判断是否成环:运用并查集)
基本思想
   先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点(即这n个顶点都是独立的),之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有 n-1 条边为止。
  时间复杂度为为O(e^2), 使用并查集优化后复杂度为 O(eloge),与网中的边数有关,适用于求边稀疏的网的最小生成树
 
例:hdoj-1233 还是畅通工程 点击打开链接
 
 
普里姆算法:.先选取一个点作起始点,然后选择它邻近的权值最小的点(如果有多个与其相连的相同最小权值的点,随便选取一个)。如1作为起点。
基本思想:
    从连通网络 N = { V, E }中的某一顶点 u0 出发, 选择与它关联的具有最小权值的边( u0, v ), 将其顶点加入到生成树顶点集合U中。
   以后每一步从一个顶点在 U 中,而另一个顶点不在 U 中的各条边中选择权值最小的边(u, v), 把它的顶点加入到集合 U 中。如此继续下去, 直到网络中的所有顶点都加入到生成树顶点集合 U 中为止。 (从点查找)
采用邻接矩阵或邻接表作为图的存储表示  
当各边有相同权值时,由于选择的随意性,产生的生成树可能不唯一。当各边的权值不相同时,产生的生成树是唯一的
 
例:
 
0 0
原创粉丝点击