最小生成树-----在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

应用场景

1、假设以下情景,有一块木板,板上钉上了一些钉子,这些钉子可以由一些细绳连接起来。假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样的情况,

即用最少的细绳把所有钉子连接起来。

2、更为实际的情景是这样的情况,在某地分布着N个村庄,现在需要在N个村庄之间修路,每个村庄之前的距离不同,问怎么修最短的路,将各个村庄连接起来。

以上这些问题都可以归纳为最小生成树问题,用正式的表述方法描述为:给定一个无方向的带权图G=(V, E),最小生成树为集合TT是以最小代价连接V中所有顶点所用边E的最小集合。 集合T中的边能够形成一颗树,这是因为每个节点(除了根节点)都能向上找到它的一个父节点。

一、kruskal(克鲁斯卡尔)

先对所有边进行排序,以权值最小的边所在的点为根节点开始处理,用一个for循遍历所有排序后的边,若这条边的两个点的根节点不同,累加上权值,再把这两个点合并,一直处理到最后即可
需要用到并查集知识(并查集的加边操作记得用路径压缩,避免超时),和结构体的排序

模板:

int p[],r[];
int n,ans;
struct node
{
int x;//x,y是坐标,v是权值
int y;
int v;
}a[];
bool cmp(node b,node c)
{
return b.v<c.v;
}
int find(int x)//查找元素x的老板是谁
{
if (x == p[x])
return x;
else
return p[x] = find(p[x]);
} void join(int x, int y)//路径压缩合并两个集合
{
int xRoot = find(x);
int yRoot = find(y); if (xRoot == yRoot) //老板相同,不合并
return;
//cnt=cnt-1;
if (r[xRoot] < r[yRoot]) //r[i]是元素i所在树的高度,矮树的根节点认高树的根节点做老板
p[xRoot] = yRoot;
else if (r[xRoot] > r[yRoot])
p[yRoot] = xRoot;
else
{
p[yRoot] = xRoot;//树高相同,做老板的树高度要加一
r[xRoot]++;
}
}
void kruskal()
{
for(int i=;i<=n;i++)//初始化根节点
p[i]=i;
sort(a+,a+n*(n-)/+,cmp);
for(int i=;i<=n*(n-)/;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
join(a[i].x,a[i].y);
ans=ans+a[i].v;
}
}
}

二、Prime(普里姆)

由顶点开始(可以随便找一个为顶点)形成一个点集,每次从剩余点中找一个与这个点集最近的点(权值最小的点)并加入点集,直到结束

以下流程图转载自https://blog.csdn.net/lqcsp/article/details/14118871,谢谢博主^-^

知道了普利姆算法的核心步骤,下面我就用图示法来演示一下工作流程,如图:

首先,确定起始顶点。我以顶点A作为起始点。根据查找法则,与点A相邻的点有点B和点H,比较AB与AH,我们选择点B,如下图。并将点B加入到U中。

继续下一步,此时集合U中有{A,B}两个点,再分别以这两点为起始点,根据查找法则,找到边BC(当有多条边权值相等时,可选任意一条),如下图。并将点C加入到U中。

继续,此时集合U中有{A,B,C}三个点,根据查找法则,我们找到了符合要求的边CI,如下图。并将点I加入到U中。

继续,此时集合U中有{A,B,C,I}四个点,根绝查找法则,找到符合要求的边CF,如下图。并将点F加入到集合U中。

继续,依照查找法则我们找到边FG,如下图。并将点G加入到U中。

继续,依照查找法则我们找到边GH,如下图。并将点H加入到U中。

继续,依照查找法则我们找到边CD,如下图。并将点D加入到U中。

继续,依照查找法则我们找到边DE,如下图。并将点E加入到U中。

此时,满足U = V,即找到了这颗最小生成树。

模板:

void prim()
{
ans=;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)//初始化
dis[i]=a[][i];
dis[]=;
vis[]=; for(int i=;i<n;i++)//最后一个点不需要处理,直接加入即可,所以不要(也不能)取等
{
int k=,mn=;
for(int j=;j<=n;j++)//找出还没有被标记的点中离起点权值最小的点
{
if(!vis[j]&&dis[j]<mn)
{
mn=dis[j];
k=j;
}
}
vis[k]=;
ans=ans+mn;
for(int j=;j<=n;j++)//更新最小值,k和起点都在处理过的集合里面,更新到起点的最小值
{
if(!vis[j]&&dis[j]>a[k][j])
dis[j]=a[k][j];
}
} }

模板题:hdu1233 还是畅通工程 https://www.cnblogs.com/-citywall123/p/10999949.html

最小生成树(Kruskal+Prim)--模板的更多相关文章

  1. POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解

    题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...

  2. Kruskal && Prim模板

    1. Kruskal(并查集模板): /* Kruskal:并查集实现,记录两点和距离,按距离升序排序,O (ElogE) */ struct Edge { int u, v, w; bool ope ...

  3. 最小生成树模板【kruskal & prim】

    CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...

  4. 最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法

    Kruskal模板:按照边权排序,开始从最小边生成树 #include<algorithm> #include<stdio.h> #include<string.h> ...

  5. 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较

    最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...

  6. 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

    最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...

  7. 最小生成树算法prim and kruskal

    一.最小生成树定义:  从不同顶点出发或搜索次序不同,可得到不同的生成树  生成树的权:对连通网络来说,边附上权,生成树也带权,我们把生成树各边的权值总和称为生成树的权  最小代价生成树:在一个连通网 ...

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

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

  9. java实现最小生成树的prim算法和kruskal算法

    在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...

  10. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

随机推荐

  1. Linux-使用之vim编译安装出现的问题

    ---恢复内容开始--- cd <directory> Short for "change directory". The shorthand name for the ...

  2. python的线性代数

    估计线性模型中的系数:a=np.linalg.lstsq(x,b),有b=a*x 求方阵的逆矩阵np.linalg.inv(A) 求广义逆矩阵:np.linalg.pinv(A) 求矩阵的行列式:np ...

  3. 小笔记----about JC

    JC  project JAVA,Mysql. 页面用velocity template engine render的html/css Apache Velocity template engine ...

  4. Day3-B-Round Marriage CodeForces-981F

    It's marriage season in Ringland! Ringland has a form of a circle's boundary of length LL. There are ...

  5. Day3-O-Median POJ3579

    Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - X ...

  6. 前端学习笔记系列一:1.export default / export const

    export default 是默认导出 export const 是命名导出 参考:Javascript (ES6), export const vs export default(基本上就是翻译这 ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:显示和隐藏内容

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 用 ConfigMap 管理配置【转】

    Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap. ConfigMap 的创建和使用方式与 Secret 非常类 ...

  9. iOS 十种线程锁

    锁 是什么意思? 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. 这里顺便提一下,上锁 ...

  10. STM32F103 USB虚拟串口 驱动例程移植

    1)驱动下载及安装.目前ST公司支持WIN7版本号为:VCP_V1.3.1_Setup.exe (在官网上搜索stsw-stm32102即是了):先安装驱动后再插入USB不然安装不成功. 2)固件下载 ...