最小生成数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算法来高效发现频繁项集).正如章 ...
随机推荐
- Mysql慢查询 [第一篇]
一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_q ...
- HTML标签_1
<meta charset="utf-8" /> 设置字符集 <meta name="description" content="这 ...
- 零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘
1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770&q ...
- [C#]关于Distinct与重写IEqualityComparer时得知道的二三事
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法. 先定义一个类,然后使用Distinct方法去重 class Man { public int A ...
- appium (五)desired_caps参数
转自:http://blog.csdn.net/Yejianyun1/article/details/56279051 一.介绍 在appium server 与手机端建立会话关系时,手机端需要 ...
- eclipse中安装thymeleaf插件完成thymeleaf模板中自动代码提示功能
插件地址:https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin 页面有介绍如何使用:
- vue - 绑定css、style
1.绑定html css1.1对象语法: 传给 v-bind:class 一个对象,以动态地切换 class <div v-bind:class="{ active: isActive ...
- SAP CRM和C4C的产品主数据price维护
SAP CRM 点了Edit List之后,可以直接修改产品主数据的Price信息: C4C 在C4C的product administration工作中心里: 点击Edit按钮进入编辑模式,Pric ...
- 【转载】#349 - The Difference Between Virtual and Non-Virtual Methods
In C#, virtual methods support polymorphism, by using a combination of the virtual and override keyw ...
- DOM(十四):代理检测和事件处理(跨浏览器)
一.检测 用于用户代理检测,检测范围包括浏览器引擎.平台.Windows.移动设备和游戏系统等 /* *用户代理检测脚本,检测范围包括浏览器引擎.平台.Windows.移动设备和游戏系统 */ var ...