随笔分类 -  图论

摘要:最小生成树的概念 给定无向图G = (V, E),连接G中所有点,且边集是E的子集的树称为G的生成树,而权值和最小的生成树称为最小生成树,即MST。 构造MST的方法有很多种。常用的有Kruskal算法和Prim算法,前者好写,时间复杂度为O(m),后者稍微难写,时间复杂度O(n*n)。(n为树的节点数,m为边数)。 Kruskal算法(摘自刘汝佳白书P199): 算法的第一步是给所有边按照从小到大的顺序排序,然后从小到大考查所有边。考查到边(u, v)的时候有两种情况: 情况1:u, v此时属于同一个连通分量中,则加入(u, v)会形成环,不能加入该边。 情况2:u... 阅读全文
posted @ 2013-12-12 20:18 Plumrain 阅读(754) 评论(0) 推荐(0)
摘要:题意:给一个图,判断它的最小生成树唯一不唯一。解法:首先,容易想到一个O(n^3)或者说O(m*n^2)的方法。就是首先,求一遍最小生成树,记权值和为x1,然后枚举最小生成树中的每一条边,在不用该边的情况下求出的最小生成树权值和为x2,若枚举到某条边的时候x1 = x2,则最小生成树不唯一。若全不相等,则唯一。 但是,觉得这个方法太慢了,上网搜索了一下搜到了这篇文章,https://www.byvoid.com/blog/2-sp-mst,求次小生成树。(这道题相当于判定最小生成树和次小生成树权值和是否相等) 上面那篇文章的方法,中心思想在于:枚举每条不在最小生成树中的边,若将它加入最... 阅读全文
posted @ 2013-12-04 23:55 Plumrain 阅读(293) 评论(0) 推荐(0)
摘要:题意:有p个无限电波发射点,他们每个的有效范围都是d,即能与半径为d的圆内的其他无线电波点传递信息。同时,这些无线电波点之中可以选择s个点建立通讯卫星,建立了通讯卫星的之后的点都能传递信息。给出p,s和每个无线电波发射点的坐标,求d的最小值。解法:此处就是做一遍最小生成树,输出树的所有边中第s大的那个的值。具体证明过程见[小结论]使生成树的第k大的边最小的边的求法。tag:MST 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-12-02 23:36 4 * File Name: G-POJ-2349.cpp 5 */ ... 阅读全文
posted @ 2013-12-03 02:29 Plumrain 阅读(275) 评论(0) 推荐(0)
摘要:1、问题:对一个图,要求某一个生成树,使得该生成树第k大的边最小。(来源于POJ 2349)结论:对图做一遍最小生成树,所求边即为最小生成树中第k大的边。证法:考虑求MST的Kruskal算法。 在使用Kruskal求MST的过程中,从小权边到大权边遍历所有边,遍历到每一条边的时候检查一下若将它加入生成树是否会形成环,若不形成则将它加入生成树,这样遍历完所有边之后就能求出最小生成树。 若存在一个生成树T',其第k大的边比MST(记为T)中第k大的边权值小。记T'中第k大的边为l1,T中第k大的边为l2。图中所有边按小到大排序为a1,a2...am。不妨设l1为ai,l2为aj, 阅读全文
posted @ 2013-12-02 23:35 Plumrain 阅读(224) 评论(0) 推荐(0)
摘要:畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了。1、HDU 1863畅通工程题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有村庄都连通。解法:裸的最小生成树。tag:MST由于才学MST,两种算法一个写了一遍:Kruskal: 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-11-30 10:21 4 * File Name: G-HDU-1863.cpp 5 */ 6 #include 7 #include 8 #include 9 10 using na... 阅读全文
posted @ 2013-12-01 02:44 Plumrain 阅读(395) 评论(0) 推荐(0)
摘要:在图论中,求MST的Prim算法和求最短路的Dijskra算法非常像。可是我一直都对这两个算法处于要懂不懂的状态,现在,就来总结一下这两个算法。最小生成树(MST)—Prim算法:算法步骤:•将顶点集V分成两个集合A和B,其中集合A表示目前已经在MST中的顶点,而集合B则表示目前不在MST中的顶点。•寻找与集合A连通的最短的边(u,v),将这条边加入最小生成树中。(此时,与(u,v)相连的顶点,不妨设为Bi,也应加入集合A中。•重复第二步,直至集合B为空集。正确性证明:1、由归纳法可知,只需要证明 “每次向集合A中加入一条边后都能保证,集合A这个生成树是关联到集合A中所有点的最小生成树”,就能 阅读全文
posted @ 2013-11-30 23:17 Plumrain 阅读(3320) 评论(0) 推荐(0)
摘要:题意:有一些简单化合物,每种化合物含有两种元素,要将这些化合物装到车上,但是如果车上的化合物中,存在某k个化合物正好包含k种元素,则会爆炸。现在你是装箱工人,每当你拿到一个化合物,你都会检查如果将它装到车上是否会参生爆炸,如果会你就会拒绝将这个化合物装上车。问一共会拒绝装多少个化合物。解法:将每种元素视为一个点,每种化合物视为一条边,也就是说,不能存在某k个点,恰巧为一个环。这样的话,就是每次拿到一个化合物检查一下两种元素是否在同一个连通分量里,如果在则不能装箱。这样就是一个裸的并查集了。tag:并查集 1 /* 2 * Author: Plumrain 3 * Created Time... 阅读全文
posted @ 2013-11-29 23:15 Plumrain 阅读(493) 评论(0) 推荐(0)
摘要:题意:有n个点,部分点之间可以连接无向边,每条可以连接的边都有一个权值。求一种连接方法将这些点连接成一个连通图,且所有连接了的边中权值最大的边权值最小。解法:水题,直接用Kruskal算法做一遍就行了,不过还是应该仔细想想为什么Kruskal可行。原因是,在从小边往大边遍历的过程中(一直保持图为连通图),若判定某边i必须被连接,则因为图是连通图,所以连接比它小的边不可能使边i不需要连接,所以,要使边i不需要连接,必须连接比它大的边,根据题目要求,还是连接边i情况更优。tag:最小生成树 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-1... 阅读全文
posted @ 2013-11-24 22:34 Plumrain 阅读(286) 评论(0) 推荐(0)