全栈工程师开发手册 (作者:栾鹏)
python数据挖掘系列教程

最小生成树MST

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。

也就是说,用原图中有的边,连接n个节点,保证每个节点都被连接,且使用的边的数目最少。

最小权重生成树

在一给定的无向图$G = (V, E) 中,中,中,(u, v) 代表连接顶点代表连接顶点代表连接顶点 u $与顶点 $v $的边(即),而 $w(u, v) $代表此边的权重,若存在 $T 为为为 E $的子集(即)且为无循环图,使得

w(t)=∑(u,v)∈tw(u,v)w(t)=\sum_{(u,v)\in t}w(u,v)w(t)=(u,v)∈t∑​w(u,v)

的$ w(T) $最小,则此 TTT 为 GGG 的最小生成树。

最小生成树其实是最小权重生成树的简称。

应用:

例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树

Prim算法

1)、输入:一个加权连通图,其中顶点集合为VVV,边集合为EEE;

2)、初始化:Vnew={x}V_{new}= \{x\}Vnew​={x},其中xxx为集合VVV中的任一节点(起始点),Enew={}E_{new}= \{\}Enew​={},为空;

3)、重复下列操作,直到Vnew=VV_{new}= VVnew​=V:

  • a.在集合EEE中选取权值最小的边<u,v><u, v><u,v>,其中uuu为集合VnewV_{new}Vnew​中的元素,而vvv不在VnewV_{new}Vnew​集合当中,并且v∈Vv∈Vv∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

  • b.将vvv加入集合VnewV_{new}Vnew​中,将<u,v><u, v><u,v>边加入集合EnewE_{new}Enew​中;

4)、输出:使用集合VnewV_{new}Vnew​和EnewE_{new}Enew​来描述所得到的最小生成树

Kruskal算法简述

假设 $W_N=(V,{E}) $是一个含有n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 EEE 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。

循环中可加入已加入MST的点的数量的判断,有可能提前结束循环,提高效率。

下面是hdu1233的源代码,一个用Prim算法,另一个用Kruskal,标准的MST问题。

#include <cstdio>
#include <algorithm>
using namespace std;typedef int weight_t; #define SIZE 101int N;//图的邻接矩阵
weight_t Graph[SIZE][SIZE];//各顶点到中间结果的最短距离,始终维护
weight_t D[SIZE];//标志位
bool Flag[SIZE];//Prim算法,返回MST的长度
weight_t Prim(){//初始化数组fill(D,D+SIZE,INT_MAX);fill(Flag,Flag+SIZE,false);//初始化第一个计算的点D[1] = 0;weight_t ans = 0;for(int i=1;i<=N;++i){//找出距离中间结果最近的点int k = -1;for(int j=1;j<=N;++j)if ( !Flag[j] && ( -1 == k || D[j] < D[k] ) )k = j;//将k点加入中间结果Flag[k] = true;ans += D[k];//更新剩余点到中间结果的最短距离for(int j=1;j<=N;++j)if ( !Flag[j] && Graph[k][j] < D[j] )D[j] = Graph[k][j];}return ans;
}bool read(){scanf("%d",&N);if ( 0 == N ) return false;for(int i=0;i<N*(N-1)/2;++i){int a,b,w;scanf("%d%d%d",&a,&b,&w);Graph[a][b] = Graph[b][a] = w;}return true;
}int main(){while( read() ){printf("%d\n",Prim());}return 0;
}
#include <cstdio>
#include <algorithm>
using namespace std;typedef int weight_t; #define SIZE 101//并查集结构
int Father[SIZE];
void init(int n){for(int i=0;i<=n;Father[i]=i++);}
int find(int x){return Father[x]==x?x:Father[x]=find(Father[x]);}
void unite(int x,int y){Father[find(y)]=Father[find(x)];}int N;//边结构
struct edge_t{int s;int e;weight_t w;
}Edge[SIZE*SIZE/2];
int ECnt = 0;//重载,用于边排序
bool operator < (edge_t const&lhs,edge_t const&rhs){if ( lhs.w != rhs.w ) return lhs.w < rhs.w;if ( lhs.s != rhs.s ) return lhs.s < rhs.s;return lhs.e < rhs.e;
}//生成边
inline void mkEdge(int a,int b,weight_t w){if ( a > b ) swap(a,b);Edge[ECnt].s = a;Edge[ECnt].e = b;Edge[ECnt++].w = w;
}//Kruskal算法,vn是点的数量,en是边的数量,返回MST的长度
weight_t Kruskal(int vn,int en){init(vn);//并查集初始化sort(Edge,Edge+en);//边排序weight_t ans = 0;for(int i=0;i<en;++i){//该边已存在于MST中if ( find(Edge[i].s) == find(Edge[i].e) )continue;//将该边加入MSTans += Edge[i].w;unite(Edge[i].s,Edge[i].e);--vn;//MST已完全生成if ( 1 == vn ) break;}return ans;
}bool read(){scanf("%d",&N);if ( 0 == N ) return false;ECnt = 0;for(int i=0;i<N*(N-1)/2;++i){int a,b,w;scanf("%d%d%d",&a,&b,&w);mkEdge(a,b,w);}return true;
}int main(){while( read() ){printf("%d\n",Kruskal(N,ECnt));}return 0;
}

python机器学习案例系列教程——最小生成树(MST)的Prim算法和Kruskal算法相关推荐

  1. 数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)

    图的应用:最小生成树 最小生成树的定义: 最小生成树的性质: Prime算法:(贪心算法思想) Prime算法的代码实现原理: Prime算法的实现代码: Prime算法的性能: Kruskal算法: ...

  2. 最小生成树图之-Prim算法和Kruskal算法

    最小生成树算法: 结合上一章学习了解了图的基本概念,接下来了解一下最小生成树的两种算法. Prim算法(普里姆算法): 思想:找到所有最短的权值连接的顶点集合,所组成的树是最小生成树. 从某一顶点为起 ...

  3. python机器学习案例系列教程——CTR/CVR中的FM、FFM算法

    全栈工程师开发手册 (作者:栾鹏) python教程全解 FM问题来源 CTR/CVR预测时,用户的性别.职业.教育水平.品类偏好,商品的品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性. ...

  4. 作业1-采用Prim算法和Kruskal算法构造最小生成树

    采用Prim算法和Kruskal算法构造最小生成树 实验报告 1.问题 2.解析 (1)Prim算法 (2)Kruskal算法 3.设计 (1)Prim算法 (2)Kruskal算法 4.分析 (1) ...

  5. 加权无向图与最小生成树(Prim算法和Kruskal算法)

    目录 0 引入 1 图的最小生成树定义及相关约定 2 最小生成树原理 2.1 性质 2.2 切分定理 3 贪心思想 4 Prim算法 4.1 算法步骤 4.2 API设计 4.3 Java代码演示 5 ...

  6. 求的带权图最小生成树的Prim算法和Kruskal算法

    求的带权图最小生成树的Prim算法和Kruskal算法 最小生成树的概念 最小生成树其实是最小权重生成树的简称. 一个连通图可能有多个生成树.当图中的边具有权值时,总会有一个生成树的边的权值之和小于或 ...

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

    一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 输入:一个加权连 ...

  8. 【最小生成树】Prim算法和Kruskal算法的区别对比

    Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法- 从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的- 所以说,Krus ...

  9. 最小生成树-Prim算法和Kruskal算法

    转载自:https://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html Prim算法 1.概览 普里姆算法(Prim算法),图论 ...

最新文章

  1. R构建二次回归模型( Quadratic Regression)
  2. mysql获取两个表中日期字段的最小差值
  3. Monkey测试1——Monkey的使用
  4. 明星+本土化,vivo国际化的两大开路先锋
  5. matlab 中fft的用法
  6. idea报错Class not found (在target中没有生成对应的class文件)
  7. python给函数添加属性_如何在python中自动向类添加属性?
  8. backlog配置_Tomcat 配置详解和调优
  9. 程序员,该注意下啦!
  10. java字符后移_java把字符串参数往后移3位后输出
  11. 李彦宏 AI 布局又下一城,成立生命科学公司“百图生科”
  12. 12.docker inspect
  13. 2020年中国网络安全产业白皮书分析解读
  14. excel服务器运行失败怎么办,解决勤哲EXCEL服务器启动失败的问题
  15. 深度学习优化算法:AdaDelta算法
  16. 计算机病毒怎么取消,电脑病毒恶意软件无法删除。怎么办?
  17. 用Everspin MR2xH40xDF SPI-MRAM替换赛普拉斯CY15B104QN SPI-FRAM
  18. Bit Miracle Jpegv2.1.1117
  19. 卸载有管理密码的瑞星企业版客户端
  20. 如何查看TR069 协议设备的在线状态

热门文章

  1. python语言的主网址-python调用浏览器,打开一个网址
  2. 语音识别介绍(下篇)
  3. java 代码智能提示,如何在Eclipse中设置Java、JavaScript、HTML智能代码提示
  4. python爬虫爬取多个页面_Python爬虫笔记:爬取单个页面
  5. mysql 访问速度_操作mysql第一次访问速度慢(远程)
  6. 指针法算中点坐标c语言,C语言:利用指针编写程序,用梯形法计算给定的定积分实例...
  7. Linux 使用 shell 脚本处理字符串
  8. AcWing提高算法课Level-3 第四章 高级数据结构
  9. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南):签到题A Matrix Equation(高斯消元求线性异或方程组自由元个数)
  10. C++中缀表达式求值(中缀表达式转后缀表达式)