定义

连通图:在无向图中,若任意两个顶点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. HDU6315 Naive Operations(线段树 复杂度分析)

    题意 题目链接 Sol 这题关键是注意到题目中的\(b\)是个排列 那么最终的答案最多是\(nlogn\)(调和级数) 设\(d_i\)表示\(i\)号节点还需要加\(d_i\)次才能产生\(1\)的 ...

  2. ansible软件相关模块丶计划任务,剧本

    软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...

  3. javascript中如何实现继承

    javascript中如何实现继承 // 原型方式的'继承' function Person(name) { //定义一个Person的构造函数 this.name = name; //添加属性 } ...

  4. android 扇形菜单

    引言: android中的菜单与windows的菜单没有什么区别,基本就是一个矩形框,如下: 这个菜单有多么能经得住历史的考验我就不多说了!我们再来看看最新有关手机可操作区域的调查 有此可以看出屏幕越 ...

  5. 海量数据去重之SimHash算法简介和应用

    SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或 ...

  6. Spring Cloud学习路线

    学习本学习路线学习完,大家将会对微服务.Spring Cloud.Docker.Kubernetes有一个系统.全面的认识.通过学习,将能掌握相关的知识体系,并能够投入到项目实战中去. 本学习路线采用 ...

  7. 类型信息(RTTI和反射)——RTTI

    运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就先来说下RTTI. 1.RTTI: RTTI:在运行时,识别一个 ...

  8. 显示、更改ubuntu linux主机名(计算机名)

    在bash中输入hostname可以显示计算机名.Linux和windows都可以使用这条指令. 主机名保存在/etc/hostname文件中 需要进入Root权限才可以修改该文件. sudo ged ...

  9. 如何使用ABSL代码调用Web service

    需求:在C4C UI里创建web service(maintain ticket),然后通过ABSL代码消费. 1. 创建一个新的Communication Arrangement 基于Manage ...

  10. Installing xgboost and cmake, mingw64 and mingw

    Problem: installing the xgboost to get the python package for later importing