最小生成树是图的一部分,一般求最小生成树用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++数据结构之最小生成树的更多相关文章

  1. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  2. 【数据结构】 最小生成树(三)——prim算法

    上一期介绍到了kruskal算法,这个算法诞生于1956年,重难点就是如何判断是否形成回路,此处要用到并查集,不会用当然会觉得难,今天介绍的prim算法在kruskal算法之后一年(即1957年)诞生 ...

  3. 【数据结构】 最小生成树(二)——kruskal算法

    上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小. ...

  4. 数据结构:最小生成树--Prim算法

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  5. 数据结构:最小生成树--Kruskal算法

    Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...

  6. 数据结构--画画--最小生成树(Prim算法)

    通信网络的最小生成树配置,它是使右侧的生成树值并最小化.经常使用Prim和Kruskal算法.看Prim算法:以防万一N={V,{E}}它是在通信网络,TE它是N设置边的最小生成树.从算法U={u0} ...

  7. 数据结构之最小生成树Prim算法

    普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树算法 基本思想:对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最 ...

  8. 数据结构之最小生成树Kruskal算法

    1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...

  9. 【数据结构】最小生成树之prim算法和kruskal算法

    在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...

随机推荐

  1. 安装GeoIP数据库

    1.安装GeoIP数据库 cd /usr/local/logstash/etc curl -O "http://geolite.maxmind.com/download/geoip/data ...

  2. C语言的本质(36)——makefile基础

    除了Hello World这种极简单的程序之外,一般的程序都是由多个源文件编译链接而成的,这些源文件的处理步骤通常用Makefile来管理.makefile带来的好处就是--"自动化编译&q ...

  3. < IOS > IOS适配,简单的分析解决一下

    版权:张英堂 欢迎转载,转载请注明出处. 做的项目很多,一到适配的时候头就大了,IOS6,7的适配,屏幕的适配,当然还有下一步要出4.7屏幕,也要做适配....悲剧的移动端的人员. 怎么做一个通用的适 ...

  4. WordPress SEO ☞ WordPress网站终极优化指南

    原文地址:http://www.eastdesign.net/wordpress-seo/ 最新消息,东方设计学院 WordPress SEO 系列视频教程正在持续更新中,目前为了不至于让视频传播过于 ...

  5. House Robber 解答

    Question You are a professional robber planning to rob houses along a street. Each house has a certa ...

  6. Minimum Size Subarray Sum 解答

    Question Given an array of n positive integers and a positive integer s, find the minimal length of ...

  7. 求解答,Android源码编译时怎样添加第三方jar包

    各位大神好,遇到的问题如标题. 我用Eclipse写了一个android工程,但是这个工程需要到SDK的隐藏类,所有想在源码下编译,但是每次mm之后,都会出现错误,提示是找不到对应的类. 我需要加入的 ...

  8. openssl 生成CSR

    openssl 生成CSR 2013-12-27 15:05 3699人阅读 评论(1) 收藏 举报  分类: Security(38)  C/C++(105)  版权声明:本文为博主原创文章,未经博 ...

  9. LightOJ 1338 && 1387 - Setu && LightOJ 1433 && CodeForces 246B(水题)

    B - B Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status P ...

  10. 1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

     1 游戏逻辑架构 具体介绍 A 一个导演同一时间仅仅能执行一个场景,场景其中,能够同一时候载入多个层,一个层能够可载多个精灵.层中亦能够加层. B  场景切换 sceneàaddChild(la ...