最小生成数kruskal算法和prim算法
定义
连通图:在无向图中,若任意两个顶点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算法的更多相关文章
- Algorithm --> Kruskal算法和Prim算法
最小生成树之Kruskal算法和Prim算法 Kruskal多用于稀疏图,prim多用于稠密图. 根据图的深度优先遍历和广度优先遍历,可以用最少的边连接所有的顶点,而且不会形成回路.这种连接所有顶点并 ...
- 求最小生成树——Kruskal算法和Prim算法
给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这两个算法其实都是贪心思想的使用,但又能求出最优解.(代码借鉴http://blog.csdn.net/ ...
- 最小生成树之Kruskal算法和Prim算法
依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...
- 最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法
Kruskal模板:按照边权排序,开始从最小边生成树 #include<algorithm> #include<stdio.h> #include<string.h> ...
- 贪心算法-最小生成树Kruskal算法和Prim算法
Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...
- 最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
- Prim算法和Dijkstra算法的异同
Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
随机推荐
- Android基础Activity篇——销毁活动
销毁活动只需要添加 finish(); 这个方法即可.相当于back键.
- 解决javascript四舍五入不准确
function roundFixed(num, fixed) { var pos = num.toString().indexOf('.'), decimal_places = num.toStri ...
- Google面试准备
本人小弱,面试过了Google的HC,虽然team match还没完成,到最后还有变数.但对自己这段时间的努力,也算一个交代了. 最初是一年半前Google的HR联系到我,然后第一次在电面就挂了.经过 ...
- nginx的常用命令
一.nginx的解压安装 #tar xzvf nginx-1.6.0.tar.gz #cd nginx-1.6.0 #./configure --prefix=/home/weixin/loca ...
- centos6.5_64bit_tomcat日志合并在一个.log下
问题 tomcat每次启动时,自动在logs目录下生产以下日志文件,且每天都会生成对应日期的一个文件,造成日志文件众多: 目的 Tomcat以上日志都输出到同一个文件中. 修 ...
- HCNA配置telnet远程管理
1.拓扑图 说明:通过配置最终能通过R5 用telnet协议登陆到R4上并将R4改名为R44 2.R4配置 <Huawei>sys Enter system view, return us ...
- Verilog三线 - 八线译码器
参阅了一些书籍和网上的写法,在此Mark. 布尔表达式法 module decode3_8_assign (data_in,data_out,enable);//算法实现 :] data_in; in ...
- MySQL入门很简单: 11 mysql函数
1. 数学函数 2. 字符串函数 3. 日期和时间函数 4. 条件判断函数 IF(expr, v1, v2) // 如果表达式expr成立,返回结果v1,否则返回v2: IFNULL(v1, v2) ...
- C盘压缩,电脑无法正常启动的解决方法?
有时候,我们觉得电脑很卡,因此压缩磁盘来节约资源,前段时间,由于不小心将C盘压缩了,导致电脑无法正常启动,查了一些有关的资料,发现很多人都遇到过类似的问题,如果你不想重装系统的话,那么,现在我说一下我 ...
- CRUD全栈式编程架构之界面层的设计
Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面 ...