定义

连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。

强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。

连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。

生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。

最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

kruskal算法

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

1. 把图中的所有边按代价从小到大排序;

2. 把图中的n个顶点看成独立的n棵树组成的森林;

3. 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。

4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。

prim算法

此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

1. 图的所有顶点集合为VV;初始令集合u={s},v=V−uu={s},v=V−u;

2. 在两个集合u,vu,v能够组成的边中,选择一条代价最小的边(u0,v0)(u0,v0),加入到最小生成树中,并把v0v0并入到集合u中。

3. 重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。

kruskal算法:

#include <iostream>
#include <list>
#include <vector>
#include <algorithm> const int INFINITE = 0x7FFFFFFF;
const int VERTEX = ;
const char szVertex[] = { 'A', 'B', 'C', 'D', 'E', 'F' }; struct stEdge
{
int u;
int v;
int weight; stEdge(int iu, int iv, int iweight):u(iu),v(iv),weight(iweight) {} friend bool operator<(const stEdge &a, const stEdge &b) { return a.weight < b.weight; }
}; void createGraph(int (*g)[VERTEX])
{
for (int i = ; i < VERTEX; i++)
{
for (int j = ; j < VERTEX; j++)
{
g[i][j] = INFINITE;
}
}
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
} void initEdges(std::vector<stEdge> &edges, const int (*g)[VERTEX])
{
for (int i = ; i < VERTEX; ++i)
{
for (int j = i+; j < VERTEX; ++j)
{
edges.push_back(stEdge(i,j,g[i][j]));
}
}
std::sort(edges.begin(), edges.end(), std::less<stEdge>());
} bool notSameTree(int u, int v, std::vector<std::list<int> > &trees)
{
int uindex = -, vindex = -; for (int i = ; i < VERTEX; ++i)
{
if (std::find(trees[i].begin(), trees[i].end(), u) != trees[i].end())
{
uindex = i;
}
if (std::find(trees[i].begin(), trees[i].end(), v) != trees[i].end())
{
vindex = i;
}
} if (uindex != vindex)
{
trees[uindex].splice(trees[uindex].end(), trees[vindex]);
return true;
} return false;
} void kruskal(const int (*g)[VERTEX])
{
std::vector<stEdge> edges;
initEdges(edges, g); std::vector<std::list<int> > trees(VERTEX);
for (int i = ; i < VERTEX; ++i)
{
trees[i].push_back(i);
} for (auto e : edges)
{
if (notSameTree(e.u, e.v, trees))
{
std::cout << szVertex[e.u] << "---" << szVertex[e.v] << std::endl;
}
}
} int main()
{
int g[VERTEX][VERTEX] = {}; createGraph(g); kruskal(g); return ;
}

prim算法:

#include <iostream>
#include <list>
#include <vector>
#include <algorithm> const int INFINITE = 0x7FFFFFFF;
const int VERTEX = ;
const char szVertex[] = { 'A', 'B', 'C', 'D', 'E', 'F' }; struct stEdge
{
int index;
int weight;
}; void createGraph(int (*g)[VERTEX])
{
for (int i = ; i < VERTEX; i++)
{
for (int j = ; j < VERTEX; j++)
{
g[i][j] = INFINITE;
}
}
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
g[][] = ; g[][] = ; g[][] = ;
} int minIndex(const stEdge *weightArr, int len)
{
int min = INFINITE;
int idx = -; for (int i = ; i < len; ++i)
{
if (weightArr[i].weight != && min > weightArr[i].weight)
{
min = weightArr[i].weight;
idx = i;
}
} return idx;
} void prim(const int (*g)[VERTEX], int index)
{
stEdge weightArr[VERTEX]; weightArr[index].weight = ;
weightArr[index].index = index;
for (int i = ; i < VERTEX; ++i)
{
if (i != index)
{
weightArr[i].index = index;
weightArr[i].weight = g[index][i];
}
} for (int i = ; i < VERTEX; ++i)
{
int nextIndex = minIndex(weightArr, VERTEX);
if (nextIndex != -)
{
std::cout << szVertex[weightArr[nextIndex].index] << "---" << szVertex[nextIndex] << std::endl; weightArr[nextIndex].weight = ;
weightArr[nextIndex].index = nextIndex;
for (int j = ; j < VERTEX; ++j)
{
if (weightArr[j].weight != && g[nextIndex][j] < weightArr[j].weight)
{
weightArr[j].index = nextIndex;
weightArr[j].weight = g[nextIndex][j];
}
}
}
}
} int main()
{
int g[VERTEX][VERTEX] = {}; createGraph(g); prim(g, ); return ;
}

转载自:https://blog.csdn.net/luoshixian099/article/details/51908175

最小生成数kruskal算法和prim算法的更多相关文章

  1. Algorithm --> Kruskal算法和Prim算法

    最小生成树之Kruskal算法和Prim算法 Kruskal多用于稀疏图,prim多用于稠密图. 根据图的深度优先遍历和广度优先遍历,可以用最少的边连接所有的顶点,而且不会形成回路.这种连接所有顶点并 ...

  2. 求最小生成树——Kruskal算法和Prim算法

    给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这两个算法其实都是贪心思想的使用,但又能求出最优解.(代码借鉴http://blog.csdn.net/ ...

  3. 最小生成树之Kruskal算法和Prim算法

    依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...

  4. 最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法

    Kruskal模板:按照边权排序,开始从最小边生成树 #include<algorithm> #include<stdio.h> #include<string.h> ...

  5. 贪心算法-最小生成树Kruskal算法和Prim算法

    Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...

  6. 最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  7. Prim算法和Dijkstra算法的异同

    Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...

  8. mahout中kmeans算法和Canopy算法实现原理

    本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...

  9. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

随机推荐

  1. 处理http请求时,如何处理url的参数

    1.@PathVariable 获取url中的数据 这种写法显得简洁 也可以把参数写在前面 @RequestParam 获取请求参数的值 适合传统的get提交参数的获取 给参数id设置一个默认值 不传 ...

  2. 从零开始的全栈工程师——JS面向对象(初篇)

    面向对象编程 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式.它使用先前建立的范例,包括模块化,多态和封装几种技术.今天,许多流行的编程语言(如Java,JavaScript,C#,C+ ...

  3. u-boot分析(六)----时钟初始化

    u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1.       ...

  4. 炫酷的Html+css (一)

    博客园在别的 博主看到一个样式, 里面有一段这样的 正方体旋转的 动态图 吸引了我. 找博主要了代码, 贴出来 与大家共享. 鼠标放上去会展开 一大一小两个正方体, 鼠标悬浮上去, 外面的正方体会展开 ...

  5. 进一步了解this和super

    知乎上看到一问题很好,拿了与大家分享,原地址:https://www.zhihu.com/question/31548104. 问: JAVA 中this 和super与覆写冲突的问题? 实例一: 输 ...

  6. SPICE简史

    如今每一天都有不知其数的半导体芯片设计公司与设计验证工程师,在用着电路仿真软件SPICE.SPICE广泛应用在仿真模拟电路(例如运放Op Amp,能隙基准稳压电源Bandgap Reference,数 ...

  7. 监控系统 - mk-livestatus

    /usr/bin/unixcat /usr/lib64/check_mk/livestatus.o /etc/xinetd.d/livestatus service livestatus { type ...

  8. Eclipse: 导入项目乱码问题解决

    1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...

  9. 来自NVIDIA开源的pix2pixHD,将Image-to-Image Translation带到了另一个境界

    Kuo Ming Lin 分享了 Learning By Hacking 的动图 最近討論最火熱的project之一,來自NVIDIA開源的pix2pixHD,將Image-to-Image Tran ...

  10. MyEclipse 相关配置操作、问题处理及快捷键说明

    MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...