You may refer to the main idea of MST in graph theory.

http://en.wikipedia.org/wiki/Minimum_spanning_tree

Here is my own interpretation

What is Minimum Spanning Tree?

Given a connected and undirected graph, a spanning tree of that graph is a subgraph that is a tree and connects all the vertices together. A single graph can have many different spanning trees. A minimum spanning tree (MST) or minimum weight spanning tree for a weighted, connected and undirected graph is a spanning tree with weight less than or equal to the weight of every other spanning tree. The weight of a spanning tree is the sum of weights given to each edge of the spanning tree.


How many edges does a minimum spanning tree has?

A minimum spanning tree has (V – 1) edges where V is the number of vertices in the given graph.

Founding MST using Kruskal’s algorithm

  1. 1. Sort all the edges in non-decreasing order of their weight.
  2.  
  3. 2. Pick the smallest edge. Check if it forms a cycle with the spanning tree
  4. formed so far. If cycle is not formed, include this edge. Else, discard it.
  5.  
  6. 3. Repeat step#2 until there are (V-1) edges in the spanning tree.

Analise

The algorithm is a Greedy Algorithm. The Greedy Choice is to pick the smallest weight edge that does not cause a cycle in the MST constructed so far. Let us understand it with an example: Consider the below input graph.

The graph contains 9 vertices and 14 edges. So, the minimum spanning tree formed will be having (9 – 1) = 8 edges.

  1. After sorting:
  2. Weight Src Dest
  3. 1 7 6
  4. 2 8 2
  5. 2 6 5
  6. 4 0 1
  7. 4 2 5
  8. 6 8 6
  9. 7 2 3
  10. 7 7 8
  11. 8 0 7
  12. 8 1 2
  13. 9 3 4
  14. 10 5 4
  15. 11 1 7
  16. 14 3 5
Now pick all edges one by one from sorted list of edges

1.
 
Pick edge 7-6:
 No cycle is formed, include it.


2. Pick edge 8-2: No cycle is formed, include it.

3.
 
Pick edge 6-5:
 No cycle is formed, include it.


4. Pick edge 0-1: No cycle is formed, include it.

5. Pick edge 2-5: No cycle is formed, include it.

6. Pick edge 8-6: Since including this edge results in cycle, discard it.

7. Pick edge 2-3: No cycle is formed, include it.

8. Pick edge 7-8: Since including this edge results in cycle, discard it.

9. Pick edge 0-7: No cycle is formed, include it.

10. Pick edge 1-2: Since including this edge results in cycle, discard it.

11. Pick edge 3-4: No cycle is formed, include it.

Since the number of edges included equals (V – 1), the algorithm stops here.

Here is the source code demonstrating the procedure.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // a structure to represent a weighted edge in graph
  6. struct Edge
  7. {
  8. int src, dest, weight;
  9. };
  10.  
  11. // a structure to represent a connected, undirected and weighted graph
  12. struct Graph
  13. {
  14. // V-> Number of vertices, E-> Number of edges
  15. int V, E;
  16.  
  17. // graph is represented as an array of edges. Since the graph is
  18. // undirected, the edge from src to dest is also edge from dest
  19. // to src. Both are counted as 1 edge here.
  20. struct Edge* edge;
  21. };
  22.  
  23. // Creates a graph with V vertices and E edges
  24. struct Graph* createGraph(int V, int E)
  25. {
  26. struct Graph* graph = (struct Graph*) malloc( sizeof(struct Graph) );
  27. graph->V = V;
  28. graph->E = E;
  29.  
  30. graph->edge = (struct Edge*) malloc( graph->E * sizeof( struct Edge ) );
  31.  
  32. return graph;
  33. }
  34.  
  35. // A structure to represent a subset for union-find
  36. struct subset
  37. {
  38. int parent;
  39. int rank;
  40. };
  41.  
  42. // A utility function to find set of an element i
  43. // (uses path compression technique)
  44. int find(struct subset subsets[], int i)
  45. {
  46. // find root and make root as parent of i (path compression)
  47. if (subsets[i].parent != i)
  48. subsets[i].parent = find(subsets, subsets[i].parent);
  49.  
  50. return subsets[i].parent;
  51. }
  52.  
  53. // A function that does union of two sets of x and y
  54. // (uses union by rank)
  55. void Union(struct subset subsets[], int x, int y)
  56. {
  57. int xroot = find(subsets, x);
  58. int yroot = find(subsets, y);
  59.  
  60. // Attach smaller rank tree under root of high rank tree
  61. // (Union by Rank)
  62. if (subsets[xroot].rank < subsets[yroot].rank)
  63. subsets[xroot].parent = yroot;
  64. else if (subsets[xroot].rank > subsets[yroot].rank)
  65. subsets[yroot].parent = xroot;
  66.  
  67. // If ranks are same, then make one as root and increment
  68. // its rank by one
  69. else
  70. {
  71. subsets[yroot].parent = xroot;
  72. subsets[xroot].rank++;
  73. }
  74. }
  75.  
  76. // Compare two edges according to their weights.
  77. // Used in qsort() for sorting an array of edges
  78. int myComp(const void* a, const void* b)
  79. {
  80. struct Edge* a1 = (struct Edge*)a;
  81. struct Edge* b1 = (struct Edge*)b;
  82. return a1->weight > b1->weight;
  83. }
  84.  
  85. // The main function to construct MST using Kruskal's algorithm
  86. void KruskalMST(struct Graph* graph)
  87. {
  88. int V = graph->V;
  89. struct Edge result[V]; // Tnis will store the resultant MST
  90. int e = 0; // An index variable, used for result[]
  91. int i = 0; // An index variable, used for sorted edges
  92.  
  93. // Step 1: Sort all the edges in non-decreasing order of their weight
  94. // If we are not allowed to change the given graph, we can create a copy of
  95. // array of edges
  96. qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);
  97.  
  98. // Allocate memory for creating V ssubsets
  99. struct subset *subsets =
  100. (struct subset*) malloc( V * sizeof(struct subset) );
  101.  
  102. // Create V subsets with single elements
  103. for (int v = 0; v < V; ++v)
  104. {
  105. subsets[v].parent = v;
  106. subsets[v].rank = 0;
  107. }
  108.  
  109. // Number of edges to be taken is equal to V-1
  110. while (e < V - 1)
  111. {
  112. // Step 2: Pick the smallest edge. And increment the index
  113. // for next iteration
  114. struct Edge next_edge = graph->edge[i++];
  115.  
  116. int x = find(subsets, next_edge.src);
  117. int y = find(subsets, next_edge.dest);
  118.  
  119. // If including this edge does't cause cycle, include it
  120. // in result and increment the index of result for next edge
  121. if (x != y)
  122. {
  123. result[e++] = next_edge;
  124. Union(subsets, x, y);
  125. }
  126. // Else discard the next_edge
  127. }
  128.  
  129. // print the contents of result[] to display the built MST
  130. printf("Following are the edges in the constructed MST\n");
  131. for (i = 0; i < e; ++i)
  132. printf("%d -- %d == %d\n", result[i].src, result[i].dest,
  133. result[i].weight);
  134. return;
  135. }
  136.  
  137. // Driver program to test above functions
  138. int main()
  139. {
  140. /* Let us create following weighted graph
  141. 10
  142. 0--------1
  143. | \ |
  144. 6| 5\ |15
  145. | \ |
  146. 2--------3
  147. 4 */
  148. int V = 4; // Number of vertices in graph
  149. int E = 5; // Number of edges in graph
  150. struct Graph* graph = createGraph(V, E);
  151.  
  152. // add edge 0-1
  153. graph->edge[0].src = 0;
  154. graph->edge[0].dest = 1;
  155. graph->edge[0].weight = 10;
  156.  
  157. // add edge 0-2
  158. graph->edge[1].src = 0;
  159. graph->edge[1].dest = 2;
  160. graph->edge[1].weight = 6;
  161.  
  162. // add edge 0-3
  163. graph->edge[2].src = 0;
  164. graph->edge[2].dest = 3;
  165. graph->edge[2].weight = 5;
  166.  
  167. // add edge 1-3
  168. graph->edge[3].src = 1;
  169. graph->edge[3].dest = 3;
  170. graph->edge[3].weight = 15;
  171.  
  172. // add edge 2-3
  173. graph->edge[4].src = 2;
  174. graph->edge[4].dest = 3;
  175. graph->edge[4].weight = 4;
  176.  
  177. KruskalMST(graph);
  178.  
  179. return 0;
  180. }

MST(Kruskal’s Minimum Spanning Tree Algorithm)的更多相关文章

  1. Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  2. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  3. Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST

    E. Minimum spanning tree for each edge   Connected undirected weighted graph without self-loops and ...

  4. 说说最小生成树(Minimum Spanning Tree)

    minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...

  5. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  6. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  7. HDU 4408 Minimum Spanning Tree 最小生成树计数

    Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]

    这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...

  9. hdu 4408 Minimum Spanning Tree

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

随机推荐

  1. 开启/关闭ubuntu防火墙

    LInux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw.而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的 ...

  2. ASP.NET前台JS与后台CS函数如何互相调用

    摘要: 在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况.今天就把比较实用的前后台相互调用的方法总结出来和大家分享. 在实际的Web开发中,我们可能会常常遇到 ...

  3. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  4. Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)【转载】

    Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一) 自从搞好了单向一对一关系,装满代码的心中塞进了挥之不去的情丝 —— 单相思.谁都知道音乐世界离不开情感,可谁又知 ...

  5. Spring3+MyBatis3整合log4j无法输出SQL语句问题的解决

    今天遇到了跟下面文章一模一样的问题,下面文章的解决方案很好,在这里记录保存一下. Spring3+MyBatis3整合无法输出SQL语句问题的解决

  6. log4j学习日记-写入数据库

    1.首先创建日志数据库 用的是MySQL CREATE TABLE `td_log` (   `lid` int(11) NOT NULL AUTO_INCREMENT,   `lusername` ...

  7. Spring MVC 解读——<context:component-scan/>

    转自:http://my.oschina.net/HeliosFly/blog/203149 作者:GoodLoser. Spring MVC 解读---<context:component-s ...

  8. 【PPC】Qemu怎么玩儿

    1. 编译Qemu这里不建议使用自动安装,手工编译下.Qemu源代码的质量很高,什么环境都能编译过.tar -xzvf qemu.tar.gzmkdir build-qemucd build-qemu ...

  9. 《JavaScript核心概念》基础部分重点摘录

    注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...

  10. 锐浪应用小插曲,asp.net下的使用

    下午提前完成了今天的工作内容,整了下bs中的应用,嘿嘿,其中遇到不少问题,接下来说下大概会遇到哪些问题,1:grid++ 6.0插件下载安装之后ie浏览器无法打开,居然什么都没有显示,奇葩啊,系统版本 ...