图论 - 最小生成树(Prime、Kruskal)

文章目录

  • 前言
  • Part 1:Prim算法求最小生成树
    • 1.题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例
        • 输出样例
    • 2.算法
  • Part 2:Kruskal算法求最小生成树
    • 1.题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例
        • 输出样例
    • 2.算法

前言

在这里插入图片描述

本篇博客介绍两种求最小生成树的方法:即Prime算法和Kruskal算法。Prime算法用于稠密图,也可以与Dijkstra类似用堆优化(详见《图论 - 最短路(Dijkstra、Bellman-Ford、SPFA、Floyd)》),用于稀疏图,但是稀疏图的时候求最小生成树,Kruskal 算法更加实用,所以本篇博客将不介绍堆优化的Prime算法。即:稠密图用朴素Prime算法,稀疏图用Kruskal 算法即可。

Part 1:Prim算法求最小生成树

1.题目描述

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。

由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含三个整数 u,v,w,表示点 u 和点 v 之间存在一条权值为 w 的边。

输出格式

共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

数据范围

1≤n≤500,
1≤m≤105,
图中涉及边的边权的绝对值均不超过 10000。

输入样例
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例
6

2.算法

  • prim 算法采用的是一种贪心的策略
  • prim 算法做的事情是:给定一个无向图,在图中选择若干条边把图的所有节点连起来。要求边长之和最小。在图论中,叫做求最小生成树
  • 每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小
  • 与Dijkstra算法求最短路唯一的区别在于所求距离并非该点到源点的距离(详见《图论 - 最短路(Dijkstra、Bellman-Ford、SPFA、Floyd)》),而是该点到已选点集合的最短距离
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 510;
int g[N][N];//存储图
int dt[N];//存储各个节点到生成树的距离
int st[N];//节点是否被加入到生成树中
int pre[N];//节点的前去节点
int n, m;//n 个节点,m 条边void prim()
{memset(dt,0x3f, sizeof(dt));//初始化距离数组为一个很大的数(10亿左右)int res= 0;dt[1] = 0;//从 1 号节点开始生成 for(int i = 0; i < n; i++)//每次循环选出一个点加入到生成树{int t = -1;for(int j = 1; j <= n; j++)//每个节点一次判断{if(!st[j] && (t == -1 || dt[j] < dt[t]))//如果没有在树中,且到树的距离最短,则选择该点t = j;}//如果孤立点,直返输出不能,然后退出if(dt[t] == 0x3f3f3f3f) {cout << "impossible";return;}st[t] = 1;// 选择该点res += dt[t];for(int i = 1; i <= n; i++)//更新生成树外的点到生成树的距离{if(dt[i] > g[t][i] && !st[i])//从 t 到节点 i 的距离小于原来距离,则更新。{dt[i] = g[t][i];//更新距离pre[i] = t;//从 t 到 i 的距离更短,i 的前驱变为 t.}}}cout << res;}void getPath()//输出各个边
{for(int i = n; i > 1; i--)//n 个节点,所以有 n-1 条边。{cout << i <<" " << pre[i] << " "<< endl;// i 是节点编号,pre[i] 是 i 节点的前驱节点。他们构成一条边。}
}int main()
{memset(g, 0x3f, sizeof(g));//各个点之间的距离初始化成很大的数cin >> n >> m;//输入节点数和边数while(m --){int a, b, w;cin >> a >> b >> w;//输出边的两个顶点和权重g[a][b] = g[b][a] = min(g[a][b],w);//存储权重}prim();//求最下生成树//getPath();//输出路径return 0;
}

Part 2:Kruskal算法求最小生成树

1.题目描述

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。

由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含三个整数 u,v,w,表示点 u 和点 v 之间存在一条权值为 w 的边。

输出格式

共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

数据范围

1≤n≤105,
1≤m≤2∗105,
图中涉及边的边权的绝对值均不超过 1000。

输入样例
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例
6

2.算法

  • prim 算法采用的是一种贪心的策略
  • 将所有边按照权值的大小进行升序排序,然后从小到大一一判断
  • 如果这个边与之前选择的所有边不会组成回路(用并查集判断),就选择这条边分;反之,舍去
  • 直到具有 n 个顶点的连通网筛选出来 n-1 条边为止
  • 筛选出来的边和所有的顶点构成此连通网的最小生成树
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;int p[N];//保存并查集struct E
{int a;int b;int w;//通过边长进行排序bool operator < (const E& rhs){return this->w < rhs.w;}}edg[N * 2];int res = 0;
int n, m;
int cnt = 0;//并查集找祖宗
int find(int a)
{if(p[a] != a) p[a] = find(p[a]);return p[a];
}void klskr()
{//依次尝试加入每条边for(int i = 1; i <= m; i++){int pa = find(edg[i].a);// a 点所在的集合int pb = find(edg[i].b);// b 点所在的集合//如果 a b 不在一个集合中if(pa != pb){res += edg[i].w;//a b 之间这条边要p[pa] = pb;// 合并a bcnt ++; // 保留的边数量+1}}
}int main()
{cin >> n >> m;for(int i = 1; i <= n; i++) p[i] = i;//初始化并查集//读入每条边for(int i = 1; i <= m; i++){int a, b , c;cin >> a >> b >>c;edg[i] = {a, b, c};}sort(edg + 1, edg + m + 1);//按边长排序klskr();//如果保留的边小于点数-1,则不能连通if(cnt < n - 1) {cout<< "impossible";return 0;}cout << res;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

辽宁博学优晨教育视频:引领安全可靠的学习新风尚

在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;线上教育已成为越来越多人提升自我、拓宽视野的重要选择。辽宁博学优晨教育视频凭借其安全可靠的特质&#xff0c;在众多在线教育平台中脱颖而出&#xff0c;成为广大学子信赖的学习伙伴。 一、辽宁博学优晨教育视频…

MagiskHideProps 使用 props 开启 android 手机的 ro.debuggable =1 的方法

因为 CDSN 一直不给对旧的文章&#xff08;特别是边幅比较长的文章&#xff09;一直都无法修改&#xff0c;保存&#xff0c;重新发布 一直都是操作超时 我这里是补全 这边文章中 unity shader - 圣斗士星矢 人物 shader 还原 - GPA 抓帧提取资源、shader&#xff0c;ROOT权…

python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾

现在越来越多的网站已经能够通过JA3或者其他指纹信息&#xff0c;来识别你是不是爬虫了。传统的方式比如换UA&#xff0c;加代理是没有任何意义了&#xff0c;所以这个时候我们就需要使用到curl_cffi 了。 1.TLS 指纹是啥&#xff1f; 在绝大多数的网站都已经使用了 HTTPS&am…

构造pop链

反序列化视频笔记 第一步&#xff1a;找到目标触发echo调用$flag 第二步&#xff1a;触发_invoke函数调用appeng函数$varflag.php&#xff08;把对象当成函数&#xff09; 第三步&#xff1a;给$p赋值为对象&#xff0c;即function成为对象Modifier却被当成函数调用&#xff…

加密与安全_探索口令加密算法(PBE)

文章目录 概述疑问PBE 算法 &#xff08; Password Based Encryption&#xff09;CodePOM实现 小结 概述 加密与安全_探索对称加密算法中我们提到AES加密密钥长度是固定的128/192/256位&#xff0c;而不是我们用WinZip/WinRAR那样&#xff0c;随便输入几位都可以。 这是因为对…

2024最新算法:斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)求解23个基准函数

一、斑翠鸟优化算法 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵感。PKO 算法围绕三个不…

【Ubuntu操作系统】讲解

Ubuntu操作系统 1. 前言2. 系统更新3. 安装编译工具4. 安装文本编辑器4.1 Vim4.2 Visual Studio Code 5. 安装开发库6. 安装版本控制系统6.1 Git 7. 安装数据库7.1 MySQL7.2 PostgreSQL 8. 安装编程语言环境8.1 Python8.2 Node.js 9. 安装其他常用软件9.1 Chrome浏览器9.2 Dock…

MySQL数据库引擎,以及常用引擎的区别

先看图&#xff1a; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE MYISAM&#xff1a; 全表锁&#xff0c;拥有较高的执行速度&#xff0c;不支持事务&#xff0c;不支持外键&#xff0c;并发性能差&#xff0c;占用空间相对较小&#xff0c;对事务完整性没有…

SpringBoot整合rabbitmq-主题交换机队列(四)

说明&#xff1a;Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定&#xff0c;这个绑定的Routingkey是包含通配符的&#xff0c;满足通配符的队列会接收到消息。 通配符规则&#xff1a; #&#xff1a;匹配一个或多个词 *&#xff1a;匹配一个词 例如&#xff…

2024洗地机深度测评推荐,洗地机哪款值得入手?新手入门必看洗地机选购技巧

洗地机是近年来备受瞩目的智能家居产品&#xff0c;它能够有效地帮助我们节省劳动时间&#xff0c;高效清洁地面&#xff0c;从而减轻我们的劳动负担。洗地机实现了扫地和拖地的一体化功能&#xff0c;在扫地的同时还能顺便完成地面的拖洗工作。配备水箱的设计使得不再需要频繁…

【kubernetes VPA】记录一次安装 VPA 相关组件的报错解决过程

文章目录 1. 问题描述2. 问题原因3. 解决办法4. 参考链接 1. 问题描述 在执行 ./hack/vpa-up.sh脚本命令时&#xff0c;提示有报错。名为vpa-admission-controller的容器状态一直停留在ContainerCreating&#xff0c;从该Pod详细描述中得知&#xff0c;volume "tls-certs…

内核参数调优

默认的Linux内核参数考虑的是最通用场景&#xff0c;不符合用于支持高并发访问的Web服务器的定义&#xff0c;根据业务特点来进行调整&#xff0c;当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时&#xff0c;内核参数的调整都是不同的&#xff0c;此处针…

【牛客】SQL131 作答试卷得分大于过80的人的用户等级分布

描述 现有用户信息表user_info&#xff08;uid用户ID&#xff0c;nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间&#xff09;&#xff1a; iduidnick_nameachievementleveljobregister_time11001牛客1号31007算法2020-01-01 10:00:00210…

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM&#xff0c;容量为1024/8128k bytes。它的引脚如下&#xff1a; 其中A1,A2为硬件地址引脚 WP为写保护引脚&#xff0c;一般我们需要读写&#xff0c;需要接低电平GND&#xff0c;接高的话则仅允许读 SDA和SCL则为IIC通信引脚 芯片通信采用IIC&…

02、MongoDB -- MongoDB 的安全配置(创建用户、设置用户权限、启动安全控制、操作数据库命令演示、mongodb 的帮助系统介绍)

目录 MongoDB 的安全配置演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 的安全配置启动演示用到的 mongodb 服务器 和 客户端启动单机模式的 mongodb 服务器&#xff1a;启动 mongodb 的…

【数据结构】19 平衡二叉树

定义 平衡二叉树又称为AVL树&#xff0c;是具有以下性质的非空搜索树&#xff1a; 任一结点的左、右子树均为AVL树。根节点的左、右子树高度差的绝对值不超过1. 对于二叉树的任一结点T&#xff0c;其平衡因子&#xff08;BF&#xff09;定义为BF(T) h L − h R h_L- h_R hL…

acwing算法提高之搜索--双向广搜BFS与A星算法

目录 1 专题说明2 训练 1 专题说明 本专题用来记录使用双向广搜BFS和A星算法求解的题目。 2 训练 题目1&#xff1a;190字串变换 考点&#xff1a;从起点开始搜&#xff0c;从终点开始搜&#xff0c;即双向广搜。 C代码如下&#xff0c; #include <iostream> #incl…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

使用GPTQ进行4位LLM量化

使用GPTQ进行4位LLM量化 最佳脑量化GPTQ算法步骤1:任意顺序洞察步骤2:延迟批量更新第三步:乔尔斯基重塑 用AutoGPTQ量化LLM结论References 权重量化的最新进展使我们能够在消费级硬件上运行大量大型语言模型&#xff0c;例如在RTX 3090 GPU上运行LLaMA-30B模型。这要归功于性能…