C++数据结构之最小生成树
最小生成树是图的一部分,一般求最小生成树用Prim算法和Kruskal算法。
对于Prim算法,思想是:在访问过的顶点和未访问的顶点之间选择权值最小的边。Prim算法是基于顶点的操作,适合于顶点较少,边较多的图。
对于Kruskal算法,思想是:直接从图中选择权值最小的边,并且已选择的边不能构成连通图。Kruskal算法是基于边的操作,适合于边较少,顶点较多的图。
Prim算法,在此我用了关联容器pair作为边的存储结构:
//普里姆算法
int Prim(const int G[][VNUM], vector<pair<int, int> > &edge)
{
int w = 0; //权重
vector<int> visited(VNUM, 0); //已访问节点集合
//初始化
visited[0] = 1; //0号节点已访问
//循环VNUM-1次
int u, v;
for(int number = 1; number < VNUM; ++number)
{
int min = M;
for(int i = 0; i != VNUM; ++i) //一次循环有一个节点入栈
{
if(visited[i] == 1)
{
for(int j = 1; j != VNUM; ++j) //判断边(i, j)的权值,i为已访问节点,j为未访问节点
{ if(visited[j] == 0 && G[i][j] < min)
{
min = G[i][j];
v = i;
u = j;
}
}
}
}
w += G[v][u];
visited[u] = 1;
edge[number-1].first = v;
edge[number-1].second = u;
}
return w;
}
克鲁斯卡尔算法的最小生成树结构用并查集表示,并查集在次主要用来判断已选择的边是否构成连通图,如果对应顶点x,y的FindRoot()操作返回的结果相同,即他们的根相同,则能够成连通图,说明选择的边不满足条件。
//并查集结构
class DisjointSet{
public:
vector<int> father;
DisjointSet(int VNUM){
father.resize(VNUM, -1);
}
int FindRoot(int x)
{
while(father[x] >= 0)
x = father[x];
return x;
}
void Union(int x, int y)
{
father[FindRoot(x)] = FindRoot(y);
}
};
//Kruskal
int Kruskal(const int G[][VNUM], vector<pair<int, int> > &edge)
{
int min = M;
int w = 0;
int v, u;
DisjointSet V(VNUM);
for(int num = 0; num != VNUM-1; ++num)
{
min = M;
for(int i = 0; i != VNUM; ++i)
{
for(int j = 0; j != VNUM; ++j)
{
if(G[i][j] < min && V.FindRoot(i) != V.FindRoot(j))
{
min = G[i][j];
v = i;
u = j;
}
}
}
w += G[u][v];
V.Union(u, v);
edge[num].first = v;
edge[num].second = u;
}
return w;
}
下面是主程序:
/*************************
Date : 2013-9-20
Author : DVD0423
Function: 无向图的最小生成树
******************&******/
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
const int M = 10; //两节点无边权值用M表示
const int VNUM = 6; int Prim(const int G[][VNUM], vector<pair<int, int> > &edge);
int Kruskal(const int G[][VNUM], vector<pair<int, int> > &edge); int main()
{
const int G[VNUM][VNUM] = {
M, 9, 1, M, 7, 2,
9, M, 5, 1, M, 6,
1, 5, M, 4, 2, 6,
M, 1, 4, M, 9, 3,
7, M, 2, 9, M, M,
2, 6, 6, 3, M, M
};
vector<pair<int, int> > edge(VNUM-1); //Prim
cout<<"普里姆算法:"<<endl;
cout<<"总路径长度:"<<Prim(G, edge)<<endl;
for(int i = 0; i != VNUM-1; ++i)
cout<<"("<<edge[i].first<<", "<<edge[i].second<<")"<<endl; //Kruskal
cout<<"克鲁斯卡尔算法:"<<endl;
cout<<"总路径长度:"<<Kruskal(G, edge)<<endl;
for(int i = 0; i != VNUM-1; ++i)
cout<<"("<<edge[i].first<<", "<<edge[i].second<<")"<<endl; return 0;
}
输出结果如下:
C++数据结构之最小生成树的更多相关文章
- 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...
- 【数据结构】 最小生成树(三)——prim算法
上一期介绍到了kruskal算法,这个算法诞生于1956年,重难点就是如何判断是否形成回路,此处要用到并查集,不会用当然会觉得难,今天介绍的prim算法在kruskal算法之后一年(即1957年)诞生 ...
- 【数据结构】 最小生成树(二)——kruskal算法
上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小. ...
- 数据结构:最小生成树--Prim算法
最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...
- 数据结构:最小生成树--Kruskal算法
Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
- 数据结构--画画--最小生成树(Prim算法)
通信网络的最小生成树配置,它是使右侧的生成树值并最小化.经常使用Prim和Kruskal算法.看Prim算法:以防万一N={V,{E}}它是在通信网络,TE它是N设置边的最小生成树.从算法U={u0} ...
- 数据结构之最小生成树Prim算法
普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树算法 基本思想:对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最 ...
- 数据结构之最小生成树Kruskal算法
1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...
- 【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...
随机推荐
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...
- UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>
E - 树上的距离 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Subm ...
- apache FtpServer整合spring逻辑处理
上面我们的部署工作完成了,那么文件上传下载后,ftpserver会自动相应我们的上传下载操作,也就是说ftpServer服务器会得到触发,那么我们如果要得到文件的一些信息,比如说文件的路径.大小.类型 ...
- 转化率最高的16个WordPress 电子商务主题
想自己开一个WordPress的电子商务商店?下面我们分享转化率最高的16个WordPress 电子商务主题,它们拥有最棒的用户体验,集成最新的用户体验,慢慢欣赏吧! 原文地址:http://thet ...
- SVN在ubuntu的安装和使用
安装: svn客户端:apt-get install subversion ,然后根据提示一步一步,就完成了svn的安装.当然,也可以源码安装 svn,下载 subversion 一个最新版本的源码包 ...
- hdu 5491 The Next(暴力枚举)
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- mysql的主从复制配置
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql 1.3.修改root的密码 2.修 ...
- spark-submit
一旦用户的应用打包后,就可以使用bin/spark-submit脚本来启动,此脚本就会为Spark和它的依赖安排配置环境变量,还支持不同的集群管理和部署模式: ./bin/spark-submit \ ...
- Capture the Flag(模拟)
Capture the Flag Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge In computer se ...
- kvm虚拟化之克隆篇
注意:在克隆虚拟机的时候,该虚拟机必须处于关闭状态. 1,查看目前有哪些子机并选择要克隆的子机,我选择关闭test,说明我要克隆的就是它了. 2,查看虚拟机是否关闭. virsh list --al ...