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

【刷题】图论——最小生成树:Prim、Kruskal【模板】

假设有n个点m条边。
Prim适用于邻接矩阵存的稠密图,时间复杂度是 O ( n 2 ) O(n^2) O(n2),可用堆优化成 O ( n l o g n ) O(nlogn) O(nlogn)
Kruskal适用于稀疏图,n个点m条边,时间复杂度是 m l o g ( m ) mlog(m) mlog(m)

Prim:遍历n次,每次选择连通块和外面的点到连通块距离最短的一条边,并将该边对应点加入连通块中,更新其他店到连通块的距离
Kruskal:将所有边权从小到大排序,依次枚举每条边(a和b相连,边权w),如果发现目前a和b不在一个连通块内,将a和b加入连通块中。

题目

在这里插入图片描述

题目链接

Prim

#include <iostream>
#include <cstring>using namespace std;
const int N = 110;
int n;
int w[N][N];
int dist[N]; // 外界每个点和当前连通块直接相连的边的最小值
bool st[N]; // 是否加入连通块int prim() {int res = 0;memset(dist, 0x3f, sizeof(dist));dist[1] = 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])) { // j不在连通块里且或j距离更小t = j;}}res += dist[t];st[t] = true;for (int j = 1; j <= n; j ++ ) dist[j] = min(dist[j], w[t][j]); // 更新所有t能到的距离}return res;
}
int main() {scanf("%d", &n);for (int i = 1; i <= n; i ++ ) {for (int j = 1; j <= n; j ++ ) {scanf("%d", &w[i][j]);}}cout << prim() << endl;
}

Kruskal

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
const int N = 110;
const int M = 10010;struct Edge {int a, b, w;bool operator< (const Edge &t) const {return w < t.w;}
};Edge e[M];
int p[N];
int n, w, m;int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x];
}
int kruskal() {for (int i = 1; i <= n; i ++ ) p[i] = i;sort(e, e + m);int res = 0;for (int i = 0; i < m; i ++ ) {int a = find(e[i].a);int b = find(e[i].b);if (a != b) {p[a] = b;res += e[i].w;}}return res;
}
int main() {scanf("%d", &n);m = n * n;for (int i = 0; i < n; i ++ ) {for (int j = 0; j < n; j ++ ) {scanf("%d", &w);e[i * n + j] = {i + 1, j + 1, w};}}cout << kruskal() << endl;
}
http://www.lryc.cn/news/337805.html

相关文章:

  • 使用uniapp实现小程序获取wifi并连接
  • 回忆杀之手搓当年搓过的Transformer
  • 【AR】使用深度API实现虚实遮挡
  • python-pytorch实现skip-gram 0.5.001
  • C语言:约瑟夫环问题详解
  • 【刷题篇】回溯算法(二)
  • Windows系统本地部署Jupyter Notebook并实现公网访问编辑笔记
  • 自动化运维(二十七)Ansible 实战Shell 插件和模块工具
  • Jenkins使用-绑定域控与用户授权
  • 【前端】es-drager 图片同比缩放 缩放比 只修改宽 只修改高
  • 蓝桥杯第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组题解
  • eclipse .project
  • react的闭包陷阱
  • 神经网络解决回归问题(更新ing)
  • 【小红书校招场景题】12306抢票系统
  • Spring(三)
  • 使用element-plus中的表单验证
  • flinksql
  • Dockerfile中 CMD和ENTRYPOINT的区别
  • 【TC3xx芯片】TC3xx芯片的总线内存保护
  • 抖音小店选品必经五个阶段,看你到哪一步了,直接决定店铺爆单率
  • ML在骨科手术术前、书中、术后方法应用综述【含数据集】
  • vue3-video-play 在安卓上正常播放,在ios上不能播放,问题解决
  • 【C++类和对象】上篇
  • 微信订阅号环境搭建及开发者工具下载
  • Failed to resolve ‘bss.myhuaweicloud.com‘ ([Errno -2] Name or service not know
  • 大厂基础面试题(之二)
  • swiftui macOS实现加载本地html文件
  • 科技云报道:大模型加持后,数字人“更像人”了吗?
  • 轻松驾驭时间流:MYSQL日期与时间函数的实用技巧