MST(Kruskal’s Minimum Spanning Tree Algorithm)
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. Sort all the edges in non-decreasing order of their weight.
- 2. Pick the smallest edge. Check if it forms a cycle with the spanning tree
- formed so far. If cycle is not formed, include this edge. Else, discard it.
- 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.
- After sorting:
- Weight Src Dest
- 1 7 6
- 2 8 2
- 2 6 5
- 4 0 1
- 4 2 5
- 6 8 6
- 7 2 3
- 7 7 8
- 8 0 7
- 8 1 2
- 9 3 4
- 10 5 4
- 11 1 7
- 14 3 5
1.
Pick edge 7-6:
No cycle is formed, include it.
Pick edge 6-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.
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- // a structure to represent a weighted edge in graph
- struct Edge
- {
- int src, dest, weight;
- };
- // a structure to represent a connected, undirected and weighted graph
- struct Graph
- {
- // V-> Number of vertices, E-> Number of edges
- int V, E;
- // graph is represented as an array of edges. Since the graph is
- // undirected, the edge from src to dest is also edge from dest
- // to src. Both are counted as 1 edge here.
- struct Edge* edge;
- };
- // Creates a graph with V vertices and E edges
- struct Graph* createGraph(int V, int E)
- {
- struct Graph* graph = (struct Graph*) malloc( sizeof(struct Graph) );
- graph->V = V;
- graph->E = E;
- graph->edge = (struct Edge*) malloc( graph->E * sizeof( struct Edge ) );
- return graph;
- }
- // A structure to represent a subset for union-find
- struct subset
- {
- int parent;
- int rank;
- };
- // A utility function to find set of an element i
- // (uses path compression technique)
- int find(struct subset subsets[], int i)
- {
- // find root and make root as parent of i (path compression)
- if (subsets[i].parent != i)
- subsets[i].parent = find(subsets, subsets[i].parent);
- return subsets[i].parent;
- }
- // A function that does union of two sets of x and y
- // (uses union by rank)
- void Union(struct subset subsets[], int x, int y)
- {
- int xroot = find(subsets, x);
- int yroot = find(subsets, y);
- // Attach smaller rank tree under root of high rank tree
- // (Union by Rank)
- if (subsets[xroot].rank < subsets[yroot].rank)
- subsets[xroot].parent = yroot;
- else if (subsets[xroot].rank > subsets[yroot].rank)
- subsets[yroot].parent = xroot;
- // If ranks are same, then make one as root and increment
- // its rank by one
- else
- {
- subsets[yroot].parent = xroot;
- subsets[xroot].rank++;
- }
- }
- // Compare two edges according to their weights.
- // Used in qsort() for sorting an array of edges
- int myComp(const void* a, const void* b)
- {
- struct Edge* a1 = (struct Edge*)a;
- struct Edge* b1 = (struct Edge*)b;
- return a1->weight > b1->weight;
- }
- // The main function to construct MST using Kruskal's algorithm
- void KruskalMST(struct Graph* graph)
- {
- int V = graph->V;
- struct Edge result[V]; // Tnis will store the resultant MST
- int e = 0; // An index variable, used for result[]
- int i = 0; // An index variable, used for sorted edges
- // Step 1: Sort all the edges in non-decreasing order of their weight
- // If we are not allowed to change the given graph, we can create a copy of
- // array of edges
- qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);
- // Allocate memory for creating V ssubsets
- struct subset *subsets =
- (struct subset*) malloc( V * sizeof(struct subset) );
- // Create V subsets with single elements
- for (int v = 0; v < V; ++v)
- {
- subsets[v].parent = v;
- subsets[v].rank = 0;
- }
- // Number of edges to be taken is equal to V-1
- while (e < V - 1)
- {
- // Step 2: Pick the smallest edge. And increment the index
- // for next iteration
- struct Edge next_edge = graph->edge[i++];
- int x = find(subsets, next_edge.src);
- int y = find(subsets, next_edge.dest);
- // If including this edge does't cause cycle, include it
- // in result and increment the index of result for next edge
- if (x != y)
- {
- result[e++] = next_edge;
- Union(subsets, x, y);
- }
- // Else discard the next_edge
- }
- // print the contents of result[] to display the built MST
- printf("Following are the edges in the constructed MST\n");
- for (i = 0; i < e; ++i)
- printf("%d -- %d == %d\n", result[i].src, result[i].dest,
- result[i].weight);
- return;
- }
- // Driver program to test above functions
- int main()
- {
- /* Let us create following weighted graph
- 10
- 0--------1
- | \ |
- 6| 5\ |15
- | \ |
- 2--------3
- 4 */
- int V = 4; // Number of vertices in graph
- int E = 5; // Number of edges in graph
- struct Graph* graph = createGraph(V, E);
- // add edge 0-1
- graph->edge[0].src = 0;
- graph->edge[0].dest = 1;
- graph->edge[0].weight = 10;
- // add edge 0-2
- graph->edge[1].src = 0;
- graph->edge[1].dest = 2;
- graph->edge[1].weight = 6;
- // add edge 0-3
- graph->edge[2].src = 0;
- graph->edge[2].dest = 3;
- graph->edge[2].weight = 5;
- // add edge 1-3
- graph->edge[3].src = 1;
- graph->edge[3].dest = 3;
- graph->edge[3].weight = 15;
- // add edge 2-3
- graph->edge[4].src = 2;
- graph->edge[4].dest = 3;
- graph->edge[4].weight = 4;
- KruskalMST(graph);
- return 0;
- }
MST(Kruskal’s Minimum Spanning Tree Algorithm)的更多相关文章
- Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 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 ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 数据结构与算法分析–Minimum Spanning Tree(最小生成树)
给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...
- HDU 4408 Minimum Spanning Tree 最小生成树计数
Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- hdu 4408 Minimum Spanning Tree
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
随机推荐
- 开启/关闭ubuntu防火墙
LInux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw.而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的 ...
- ASP.NET前台JS与后台CS函数如何互相调用
摘要: 在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况.今天就把比较实用的前后台相互调用的方法总结出来和大家分享. 在实际的Web开发中,我们可能会常常遇到 ...
- ASP.NET MVC轻教程 Step By Step 9——分页
现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...
- Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)【转载】
Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一) 自从搞好了单向一对一关系,装满代码的心中塞进了挥之不去的情丝 —— 单相思.谁都知道音乐世界离不开情感,可谁又知 ...
- Spring3+MyBatis3整合log4j无法输出SQL语句问题的解决
今天遇到了跟下面文章一模一样的问题,下面文章的解决方案很好,在这里记录保存一下. Spring3+MyBatis3整合无法输出SQL语句问题的解决
- log4j学习日记-写入数据库
1.首先创建日志数据库 用的是MySQL CREATE TABLE `td_log` ( `lid` int(11) NOT NULL AUTO_INCREMENT, `lusername` ...
- Spring MVC 解读——<context:component-scan/>
转自:http://my.oschina.net/HeliosFly/blog/203149 作者:GoodLoser. Spring MVC 解读---<context:component-s ...
- 【PPC】Qemu怎么玩儿
1. 编译Qemu这里不建议使用自动安装,手工编译下.Qemu源代码的质量很高,什么环境都能编译过.tar -xzvf qemu.tar.gzmkdir build-qemucd build-qemu ...
- 《JavaScript核心概念》基础部分重点摘录
注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...
- 锐浪应用小插曲,asp.net下的使用
下午提前完成了今天的工作内容,整了下bs中的应用,嘿嘿,其中遇到不少问题,接下来说下大概会遇到哪些问题,1:grid++ 6.0插件下载安装之后ie浏览器无法打开,居然什么都没有显示,奇葩啊,系统版本 ...