版权声明:本文作者靖心,靖空间地址: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. webfrom后台

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  2. Session和Cookie之间区别与联系

    一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,W ...

  3. Func的介绍——c#封装的代理

    经常看到  Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...

  4. pch文件配置

    配置.pch文件 刚上手 Xcode6 的人,总会发现之前在 6 之前常常会在“利用名-Prefix.pch”这个文件中来配置我们全局要用到的头文件,但是 xcode6 没有了,人家说,这类东西有时候 ...

  5. 对JSON数据的解析(数据推送接口)

    package com.liuqi.www; import java.util.HashMap; import java.util.Map; import org.springframework.st ...

  6. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  7. Oracle扩容日志文件

    0.检查当前数据库日志切换频率 select * from v$log_history where first_time>=to_date('2017-10-18','yyyy-mm-dd') ...

  8. 当碰到需要调试打包后的js

    在react中经常开发碰到不能热更中进行调试的,如IE之类的 这个时候我们就需要打包才能运行看到效果, 但是往往每次打包都需要很长的时间: 这个时候我们就可以直接找到打包后的文件,直接在改文件中修改: ...

  9. JS(微信小程序)处理银行卡号

    其实这是一个小程序的项目,但是JS还是那个JS 在本项目中要实现两种效果: 每隔四位插入空格: <view class='item_list'> <label>银行卡号:< ...

  10. ArcGIS Server集群布署

    ArcGIS Server集群布署 准备如下的4台机器: 计算机名 IP 布署软件 说明 VMWIN2008ENSS1 192.168.1.111 ArcGIS for Server   VMWIN2 ...