最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html
引导问题:
假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路。这时,自然会考虑这样一个问题,如何在最省经费的前提下建立这个通信网。
基于问题所建立的定义:
可以用联通网来表示N个城市以及N个城市之间可能设置的连通线路,其中网的顶点表示城市,边表示两城市之间的线路,赋予边的权值表示相应的代价。对于N个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。现在,要选择这样一颗生成树,也就是使总的耗费最少,这个问题就是构造连通网的的最小代价生成树的问题,即最小生成树问题。一颗生成树的代价就是树上各边的代价之和。
算法:
假设;连通网N = (V, {E}),则令最小生成树的初始状态为只有N个顶点而无边的非连通图T = (V, {}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在不同的连通分量上,则将该边加入到T中,否则舍去此边,选择下一条代价最小的边。以此类推,直至所有顶点都在同一个连通分量上为止。
时间复杂度:O(ElogE),适合点多边少的稀疏图。
用图来描述:
初始图 N 初始图 T

求此图的最小生成树。
第一步:先给这些边排序。

然后选择第(1)条边V1 -- V4,第一条边的两端属于两个连通分量,所以可以加入 T 中

继续选择第(2)条边V5 -- V3,第二条边的两端也属于两个连通分量,所以也可以加入 T 中

选择第(3)条边V4 -- V6,第三条边的两端也属于两个连通分量,加入 T 中

选择第四条边V1 -- V7,同样属于两个连通分量,加入 T 中

选择第五条边,V2 -- V5,也属于两个连通分量,加入 T 中

选择第六条边V2 -- V3后会变成这样

很明显,第六条边的两端是属于一个连通分量的,所以舍弃继续选择第七条边V5 -- V6

同样,第七条边的两端属于同一个连通分量,所以舍弃,选择第八条变条边V2 -- V4

和上面两条边的状况一样,所以继续舍弃,选择第九条边,V5 -- V7

到此为止,所有的点都被连通到了一起,图中仅存在一个连通分量,算法停止,T 中所选择的边和原先的点构成的图就是要找的最小生成树。
具体实现:
判断是否属于一个连通分量可以用并查集实现。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std; const int MAXN = 2e3+ ;
int pre[MAXN];
int m,n; int Find(int x) //并查集
{
return x == pre[x] ? x :(pre[x] = Find(pre[x]));
} struct Node //储存数据
{
int u, v, w;
}cy[]; int mycmp(Node a,Node b)
{
return a.w < b.w;
} void mst()
{
for(int i = ; i < ; i++)
pre[i] = i;
} int kru()
{
int ans = ;
int cnt = ;
sort(cy + , cy + n + , mycmp); //对边进行升序排序
for(int i = ; i <= n; i++) //从最小的那条边开始寻找
{
int fv = Find(cy[i].v);
int fu = Find(cy[i].u);
if(fv != fu) //如果不属于同一个连通分量就把当前这条比较小的边加进去
{
pre[fv] = fu;
ans += cy[i].w;
cnt ++;
}
if(cnt == m -) //构成了最小生成树
{
return ans;
break;
}
}
return -;
} int main()
{
//freopen("in.cpp","r",stdin);
while(~scanf("%d%d",&n,&m) && n)
{
mst();
for(int i = ; i <= n; i++)
scanf("%d%d%d",&cy[i].u, &cy[i].v, &cy[i].w);
int ans = kru();
if(ans != -)
printf("%d\n",ans);
else
printf("?\n");
}
return ;
}
最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法的更多相关文章
- 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解
本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...
- Prim算法、Kruskal算法和最小生成树 | Minimum Spanning Tree
graph to tree非常有趣! 距离的度量会极大地影响后续的分析,欧式距离会放大差异,相关性会缩小差异,导致某些细胞群分不开. 先直观看一下,第一个是Prim,第二个是Kruskal.但是肯定都 ...
- 算法练习:最小生成树 (Minimum Spanning Tree)
(注:此贴是为了回答同事提出的一个问题而匆匆写就,算法代码只求得出答案为目的,效率方面还有很大的改进空间) 最小生成树是指对于给定的带权无向图,需要生成一个总权重最小的连通图.其问题描述及算法可以详见 ...
- Minimum Spanning Tree.prim/kruskal(并查集)
开始了最小生成树,以简单应用为例hoj1323,1232(求连通分支数,直接并查集即可) prim(n*n) 一般用于稠密图,而Kruskal(m*log(m))用于系稀疏图 #include< ...
- UVAlive3662 Another Minimum Spanning Tree 莫队算法
就是莫队的模板题 /* Memory: 0 KB Time: 1663 MS Language: C++11 4.8.2 Result: Accepted */ #include<cstdio& ...
- 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 ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
随机推荐
- React + webpack 快速搭建开发环境
因网上大多React + webpack快速搭建的运行不起来,便自行写了一个.在搭建开发环境的前需安装nodejs,npm. 新建一个工作目录,比如叫reactdome,在reactdome目录中运行 ...
- 《Cracking the Coding Interview》——第17章:普通题——题目7
2014-04-28 23:28 题目:给定一个数字,用英语把它读出来. 解法:ZOJ上有相反的题目.如果我要用中文读书来呢? 代码: // 17.7 Read an integer in Engli ...
- katalon系列一:初识Katalon Studio自动化测试工具
最近准备把公司的系统搞上UI自动化,先是自己用Python+selenium+pytest写了一个框架,开始写case的时候发现效率极其慢.原因为: (1)开发为提高前端响应时间,使用前端路由技术,一 ...
- pytest 运行指定用例
pytest运行指定用例 随着软件功能的增加,模块越来越多,也意味用例越来越多,为了节约执行时间,快速得到测试报告与结果,在工作中可以通过运行指定用例,达到快速执行用例 例子目录 spec_sub1_ ...
- 使用Ghost版本Windows7系统下载安装virtualBox和centos7异常解决
使用Ghost版本Windows7系统下载安装virtualBox和centos7异常解决: 下载安装运行virtualBox时出现获取VirtualBox对象严重错误(如图): 解决方案步骤: 在开 ...
- Day3 UI:7种常用控件、4种基本布局
Android常用控件 TextView <TextView android:id="@+id/text_view" android:layout_width="m ...
- 解决windows文件名过长无法删除的问题
删除windows文件时,系统提示如下错误: 从网上找到下面的一种方法,顺利解决(原理不清楚),现记录删除方法如下: . 在要删除的文件夹(delete_dir)同级新建一个空文件夹(empty_di ...
- Linux网卡驱动程序对ethtool的支持和实现
Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用.对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ...
- CocoaPods 安装与使用
1.如果之前已经安装过的 gem list --local | grep cocoapods 会看到如下输出: cocoapods (1.1.1)cocoapods-deintegrate (1.0. ...
- 【bzoj2618】[Cqoi2006]凸多边形 半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...