版权声明:本文作者靖心,靖空间地址: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. BOM-使用定时器

    window对象包含4个定时器专用方法,说明如下表所示,使用它们可以实现代码定时运行,避免连续执行,这样可以设计动画 方法 说明 setInterval() 按照指定的周期,(以毫秒为单位)来调用函数 ...

  2. emberjs 循环中设置model的不同属性值

    //var grades = ['1', '2', '3', '4', '7', '8', '9']; ']; grades.forEach(function (item) { App.Templat ...

  3. Docker网络实践运用

    Docker 容器网络概述 要构建具有安全的一致行为的 Web 应用程序,可以使用 Docker 网络特性.根据定义,网络为容器实现了完全隔离.因此,控制应用程序所在的网络很重要.Docker 容器网 ...

  4. 如何优雅的爬取 gzip 格式的页面并保存在本地(java实现)

    1. 引言 在爬取汽车销量数据时需要爬取 html 保存在本地后再做分析,由于一些页面的 gzip 编码格式, 获取后要先解压缩,否则看到的是一片乱码.在网络上仔细搜索了下,终于在这里找到了一个优雅的 ...

  5. C#设计模式六大原则——接口隔离

    接口隔离定义: 一般有两种定义: 1:客户端不应该依赖他不需要的接口     2:类间的依赖关系应该建立在最小的接口上 我们在建立接口时,应该尽量建立单一,不臃肿庞大的接口,应尽量使接口细化,方法尽量 ...

  6. vue 实现父组件和子组件之间的数据双向绑定

    前言:vue 实现父组件给子组件传值,然后子组件可以修改回父组件的值.vue 的 prop 默认是单向数据绑定,但是偶尔需要双向绑定,这时就需要知道如何才能让子组件的数据修改时影响到父组件的数据.转载 ...

  7. 百度Ueditor编辑器

    百度的Ueditor编辑器出于安全性考虑,用户在html模式下粘贴进去的html文档会自动被去除样式和转义.虽然安全的,但是非常不方便. 1. ueditor.config.js 做出如下修改即可: ...

  8. PHP链接mysql 出现:由于目标计算机积极拒绝,无法连接

    1.PHP链接mysql 出现:由于目标计算机积极拒绝,无法连接 2.原因是mysql服务没有启动,图标呈现红色 3.启动服务即可,打开cmd,输入net start mysql即可 4.启动后,图标 ...

  9. Java 简化版学生管理系统(IO版)

    Student management system   学生管理系统IO版 详细知识点可参考一下几篇文章 常用API Java 之ArrayList集合及应用 Java 之IO流及应用 Compreh ...

  10. RxJava + Retrofit完成网络请求

    1.前言 本文基于RxJava.Retrofit的使用,若是对RxJava或Retrofit还不了解的简友可以先了解RxJava.Retrofit的用法再来看这篇文章. 在这片文章之前分别单独介绍过R ...