您的位置:首页 > 其它

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

2015-08-26 09:26 337 查看
生成树


给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树。

生成树不唯一


最小生成树:

如果边上有权值,那么使得权值和最小的生成树叫做最小生成树

构造最小生成树的准则:

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 中为止。 (从点查找)
采用邻接矩阵或邻接表作为图的存储表示

当各边有相同权值时,由于选择的随意性,产生的生成树可能不唯一。当各边的权值不相同时,产生的生成树是唯一的。





例:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: