当前位置: 首页 > news >正文

acwing算法基础之搜索与图论--prim算法

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

朴素版prim算法的关键步骤:

  1. 初始化距离数组dist,将其内的所有元素都设为正无穷大。
  2. 定义集合S,表示生成树。
  3. 循环n次:找到不在集合S中且距离集合S最近的结点t,用它去更新剩余结点到集合S的距离。
  4. 最小生成树建立完毕,边长之和等于每次的d[t]之和。

朴素版prim算法的时间复杂度为O(n^2),它用来解决稠密图的最小生成树问题。

2 模板

int n;      // n表示点数
int g[N][N];        // 邻接矩阵,存储所有边
int dist[N];        // 存储其他点到当前最小生成树的距离
bool st[N];     // 存储每个点是否已经在生成树中// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
int prim()
{memset(dist, 0x3f, sizeof dist);int res = 0;for (int i = 0; i < n; i ++ ){int t = -1;for (int j = 1; j <= n; j ++ )if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;if (i && dist[t] == INF) return INF;if (i) res += dist[t];st[t] = true;for (int j = 1; j <= n; j ++ ) dist[j] = min(dist[j], g[t][j]);}return res;
}

3 工程化

题目1:求最小生成树。

#include <iostream>
#include <cstring>using namespace std;const int N = 510;
int g[N][N];
int d[N];
bool st[N];
int n, m;void prim() {memset(d, 0x3f, sizeof d);int res = 0;for (int i = 0; i < n; ++i) {//n次循环//找到不在集合S且距离集合S最小的结点int t = -1;for (int j = 1; j <= n; ++j) {if (!st[j] && (t == -1 || d[t] > d[j])) {t = j;}}if (i && d[t] == 0x3f3f3f3f) {cout << "impossible" << endl;return;}st[t] = true;if (i) res += d[t];//用t去更新其它结点for (int j = 1; j <= n; ++j) {if (d[j] > g[t][j]) {d[j] = g[t][j];}}}cout << res << endl;return;
}int main() {cin >> n >> m;memset(g, 0x3f, sizeof g);int a, b, c;while (m--) {cin >> a >> b >> c;g[a][b] = min(g[a][b], c);g[b][a] = min(g[b][a], c);}prim();return 0;
}
http://www.lryc.cn/news/226291.html

相关文章:

  • Amazon EC2 Serial Console 现已在其他亚马逊云科技区域推出
  • hdlbits系列verilog解答(100输入逻辑门)-39
  • Python 中 Selenium 的屏幕截图
  • scrapy发json的post请求
  • 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  • 自主开发刷题应用网站H5源码(无需后端无需数据库)
  • java 读取excel/word存入mysql
  • 11.(vue3.x+vite)组件间通信方式之ref与$parent、$children
  • [工业自动化-12]:西门子S7-15xxx编程 - PLC从站 - ET200 SP系列详解
  • 消息队列简介
  • SQL中实现汉字的拼音首字母查询
  • 今天知道LiveData的ktx是真的香
  • SpringBoot中的桥接模式
  • AI爆文变现脚本:易用且免费的自动写作脚本更新了
  • 代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV
  • threejs(11)-精通着色器编程(难点)2
  • 配置cuda和cudnn出现 libcudnn.so.8 is not a symbolic link问题
  • “目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解
  • 火星加载WMTS服务
  • 为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
  • VS c++多文件编译
  • JVM关键指标监控(调优)
  • 【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示
  • skynet学习笔记03— 服务
  • 34 Feign最佳实践
  • 软文推广中如何搭建媒体矩阵
  • Unity地面交互效果——5、角色足迹的制作
  • Centos8安装出错问题
  • 计算机网络技术
  • 当电脑桌面黑屏,而你只有一个鼠标该怎么办(重启方法的平替)