最小生成树(MST)

定义

首先是一棵树(废话

其次没有回路(废话

包含全部顶点和V-1条边

边的权重和最小!!!!!

所以如果是单棵最小生成树,至少说明图是连通的。不然就是森林。

生成思路

既然是根据图生成树,那么至少要有遍历图。那么,便要从一个源点出发,来一场愉快的深搜或广搜。

深搜生成就叫DFS树(深度优先搜索树

广搜生成就叫BFS树(广度优先搜索树

我们只需要在if语句中,在递归调用语句之前做一点手脚,便可以达到目的。

Prim算法——让一棵小树长大

(别装了!Dijkstra我知道是你!)

时间复杂度

O(n^2),是根据图生成最小树的算法。

算法思路

是一个穿了马甲的Dijkstra算法。用的是蓝白点的思想。

Dijkstra是啥?https://www.cnblogs.com/Uninstalllingyi/p/10417446.html

每次循环都把一个蓝点u变成白点。并且这个蓝点u与白点相连的边权势当前所有蓝点中最小的min[u]

仔细想想,是贪心的思路哟…

好的,我们来手工模拟一下。求下面这个图的最小生成树。(里面是伪代码哟)

(emm…其实这个是绿白点…没事你就假装一下色盲。)

初始所有的点全都是蓝点,所以说这里有一个数组min[i]来表示一下。那么除了起点,其他的全部初始化为无穷大(0x3f)。即min[1]=0。权值之和用int MST=0来保存。

那么第一次循环就没什么说的了,min[1]=0是最小的蓝点,然后把1变白。然后枚举和a相连的蓝点,修改它们与白点相连的最小边权(就是min数组啦)

min[]=map[][]=;
min[]=map[][]=;
min[]=map[][]=;

第二次循环找到min[2]是最小的蓝点,变白。然后更新相连的蓝点。bulabulabula。

min[]=map[][]=; min[]=map[][]=;

第三次循环…找到min[3]=1是最小的那个…变白…更新蓝点最小值…

min[]=map[][]=;

哦,这里要注意一下,因为min[5]=2<6,所以5不用更新。

第四次循环找到点4,第五次循环找到点5.反正他们也没相连的蓝点了,所以直接变白叭。

那么,最后得到的权值之和是…

min[]+min[]+min[]+min[]+min[]=
++++=;
以1为起点生成最小生成树,min[v]表示蓝点与白点相连的最小边权。
MST表示最小生成树的权值之和。
⑴初始化min[v]=∞(v≠);min[]=;MST=;
⑵for(int i=;i<=n;i++){
①寻找min[u]最小的蓝点u
②将u标记为白点
③MST+=min[u]
④for(int v=;v<=n;v++)//与白点u相连的所有蓝点v
if(w[u][v]<min[v]) min[v]=w[u][v]//注:w[u][v]表示第u行第v个元素。第u行表示和白点u相连的所有的点。
}
⑶算法结束,MST即为最小生成树的权值之和。

高能伪代码

这里有一道洛谷的模板题

https://www.luogu.org/problemnew/show/P3366

#include<iostream>
#include<cstring>
#include<cstdio>
//prim算法
using namespace std;
const int maxx=0x3f3f3f3f;
const int MAXN=;
int n,m,x,y,z,map[MAXN][MAXN],minn[MAXN],MST=,vis[MAXN];
int main(){
scanf("%d%d",&n,&m);
memset(map,0x3f,sizeof(map));
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
if(map[x][y]>z){
map[x][y]=map[y][x]=z;
}
}
memset(minn,0x3f,sizeof(minn));
minn[]=;
for(int i=;i<=n;i++){
int u=;
for(int j=;j<=n;j++){
if(!vis[j]&&minn[u]>minn[j]){
u=j;
}
}
vis[u]=true;
MST+=minn[u];
for(int v=;v<=n;v++){
if(!vis[v]&&map[u][v]<minn[v]){
minn[v]=map[u][v];
}
}
}
printf("%d\n",MST); }

(倒是头一次知道洛谷如果不加cstdio的头文件是不可以用printf的…尴尬。

最小生成树与Prim算法的更多相关文章

  1. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  2. 最小生成树一·Prim算法

    描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...

  3. 数据结构与算法--最小生成树之Prim算法

    数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...

  4. 24最小生成树之Prim算法

    最小生成树的Prim算法 思想:采用子树延伸法 将顶点分成两类: 生长点——已经在生成树上的顶点 非生长点——未长到生成树上的顶点 使用待选边表: 每个非生长点在待选边表中有一条待选边,一端连着非生长 ...

  5. 最小生成树的Prim算法

       构造最小生成树的Prim算法    假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...

  6. hihocoder 1097 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  7. 算法学习记录-图——最小生成树之prim算法

    一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边. 最小生成树:构造连通网的最小代价(最小权值)生成树. prim算法在严蔚敏树上有解释,但是都是数学语言,很 ...

  8. Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  9. hihocoder hiho一下 第二十六周 最小生成树一·(Prim算法)

    题目1 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥 ...

  10. 无向图最小生成树(prim算法)

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小.该算法于1930年由捷 ...

随机推荐

  1. Process.waitFor()导致主线程堵塞问题

    今日开发的时候使用jdk自带的运行时变量 RunTime.getRunTime() 去执行bash命令.因为该bash操作耗时比较长,所以使用了Process.waitFor()去等待子线程运行结束. ...

  2. mysql千万级数据库插入速度和读取速度的调整

    mysql上百万数据读取和插入更新一般没什么问题,但上千万后速度会很慢,如何调整配置,提高效率.如下: 1.尽量将数据一次性写入DataFile和减少数据库的checkpoint操作,调整如下参数: ...

  3. vector 定义的二维数组的遍历

    之前我们分享了STL的一些容器,再介绍vector中只介绍了二维的vector的定义并没有说二维的vector怎么遍历,那么我们今天就来看下二维的vector怎么遍历 看下面的代码吧. #includ ...

  4. linux系统可执行文件添加环境变量使其跨终端和目录执行

    在命令行终端输入:echo $PATH 回车可打印出PATH变量对应的路径 现有一可执行文件qtFirstC,文件所在目录为:/home/lolors/qtFirstC 此时test只能在此目录下运行 ...

  5. Python入门 —— 04字符串解析

    字符串 -字符串是 Python 中最常用的数据类型.(可以说是大多数语言都常用) 1. 创建字符串 ( '' 或 "" 和 '''''')(单,双和三引号)(字符串可以为空) - ...

  6. Zookeeper -- 关于Zookeeper

    Zookeeper是什么? 分布式协调框架 Zookeeper中文件呈树形结构,树形结构下包含多个节点,称为Znode:zk中节点存储数据不超过1M,指得是Znode中存储数据不超过1M Zookee ...

  7. ruby中url解码并替换非法字符

    url中中文字符解码 str = URI.decode(url_str) 替换非法字符 if ! str.valid_encoding? p str = str.encode("UTF-16 ...

  8. 从零开始一个http服务器(二)-请求request解析

    从零开始一个http服务器 (二) 代码地址 : https://github.com/flamedancer/cserver git checkout step2 解析http request 观察 ...

  9. Java设计模式(20)——行为模式之命令模式(Command)

    一.概述 概念 类似C中的callback! UML简图 角色 客户端:创建具体命令,指定接收者 命令接口:声明命令的接口 具体命令:定义接收者和行为之间的弱耦合(execute执行方法) 请求者(I ...

  10. Zookeeper原理和实战开发经典视频教程 百度云网盘下载

    Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM   密码:r5yf