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

https://blog.csdn.net/kenden23/article/details/26821635

寻找图中最小连通的路径,图例如以下:

算法步骤:

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.

关键是第二步难,这里使用Union Find来解决,能够差点儿小于O(lgn)的时间效率来推断是否须要推断的顶点和已经选择的顶点成环。

正由于这步,使得原本简单的贪心法。变得不那么简单了。

这样本算法的时间效率达到:max(O(ElogE) , O(ElogV))

原文參考:http://www.geeksforgeeks.org/greedy-algorithms-set-2-kruskals-minimum-spanning-tree-mst/

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h> class KruskalsMST
{
struct Edge
{
int src, des, weight;
}; static int cmp(const void *a, const void *b)
{
Edge *a1 = (Edge *) a, *b1 = (Edge *) b;
return a1->weight - b1->weight;
} struct Graph
{
int V, E;
Edge *edges;
Graph(int v, int e) : V(v), E(e)
{
edges = new Edge[e];
}
virtual ~Graph()
{
if (edges) delete [] edges;
}
}; struct SubSet
{
int parent, rank;
}; int find(SubSet *subs, int i)
{
if (subs[i].parent != i)
subs[i].parent = find(subs, subs[i].parent);
return subs[i].parent;
} void UnionTwo(SubSet *subs, int x, int y)
{
int xroot = find(subs, x);
int yroot = find(subs, y);
if (subs[xroot].rank < subs[yroot].rank)
subs[xroot].parent = yroot;
else if (subs[xroot].rank > subs[yroot].rank)
subs[yroot].parent = xroot;
else
{
subs[xroot].rank++;
subs[yroot].parent = xroot;
}
} Graph *graph;
Edge *res;
SubSet *subs; void initSubSet()
{
subs = new SubSet[graph->V];
for (int i = 0; i < graph->V; i++)
{
subs[i].parent = i;
subs[i].rank = 0;
}
} void mst()
{
res = new Edge[graph->V-1]; qsort(graph->edges, graph->E, sizeof(graph->edges[0]), cmp); initSubSet(); for (int e = 0, i = 0; e < graph->V - 1 && i < graph->E; i++)
{
Edge nextEdge = graph->edges[i];
int x = find(subs, nextEdge.src);
int y = find(subs, nextEdge.des);
if (x != y)
{
res[e++] = nextEdge;
UnionTwo(subs, x, y);
}
}
} void printResult()
{
printf("Following are the edges in the constructed MST\n");
for (int i = 0; i < graph->V-1; ++i)
printf("%d -- %d == %d\n", res[i].src, res[i].des, res[i].weight);
}
public:
KruskalsMST()
{
/* 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
graph = new Graph(V, E); // add edge 0-1
graph->edges[0].src = 0;
graph->edges[0].des = 1;
graph->edges[0].weight = 10; // add edges 0-2
graph->edges[1].src = 0;
graph->edges[1].des = 2;
graph->edges[1].weight = 6; // add edges 0-3
graph->edges[2].src = 0;
graph->edges[2].des = 3;
graph->edges[2].weight = 5; // add edges 1-3
graph->edges[3].src = 1;
graph->edges[3].des = 3;
graph->edges[3].weight = 15; // add edges 2-3
graph->edges[4].src = 2;
graph->edges[4].des = 3;
graph->edges[4].weight = 4; mst();
printResult();
}
~KruskalsMST()
{
if (res) delete [] res;
if (subs) delete [] subs;
if (graph) delete graph;
}
};

Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树的更多相关文章

  1. 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 ...

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

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

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

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

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

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

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

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

  6. 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...

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

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

  8. Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树+树链剖分+线段树

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

  9. hdu 4408 Minimum Spanning Tree

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

随机推荐

  1. Windows2012开机启动项设置

    最简单方式 开始->运行->输入shell:startup 在打开的启动文件夹中,将需要启动程序的快捷方式复制进去,完工 重启试试吧 https://blog.csdn.net/tmton ...

  2. C#关于操作符重载与转换

    随便写写 首先,假设我们有一个Person类型 其类型定义如下 class Person { public string Name { get; set; } = "Person" ...

  3. Hystrix使用详解

    原文参考:http://hot66hot.iteye.com/blog/2155036 一:为什么需要Hystrix? 在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,D ...

  4. OracleServer总结进阶之系统分析(进阶完结)

    个人原创,转载请在文章头部明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10080102.html 在上一篇进阶中大概讲解了一些关于进阶方面的知识,今 ...

  5. MySQL数据库的回滚失败(JAVA)

    这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...

  6. 深入理解MyBatis的原理:整个体系

    前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系. 一.简介 1.传统的JDBC JDBC 是一种典型的桥接模式. 使用 ...

  7. xamarin.Android SQLite存储

    在可移植类库 新建: using SQLite.Net.Interop; using System; using System.Collections.Generic; using System.Li ...

  8. 可缺省的CSS布局——张鑫旭

    一.技术不难.意识很难 有些东西的东西的实现,难的不是原料.技术:而是想不到,或者说意识不到. 例如下面这个简单而又神奇的魔术: 是吧.搞通了,才发现,哦~原来这么回事,很简单的嘛,我也可以实现的!其 ...

  9. elastic job will never fire

    1. 描述 2018-08-20 18:11:01.912 [Thread-8] INFO  org.quartz.impl.StdSchedulerFactory - Using default i ...

  10. Modify Dokuwiki Email Template 修改 Dokuwiki 邮件模板

    Email Notification Templates   There are two places to modify 1) log in as Admin -> configuration ...