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

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

目录

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

1 基础知识

kruskal算法的关键步骤为:

  1. 将所有边按照权重从小到大排序。
  2. 定义集合S,表示生成树。
  3. 枚举每条边(a,b,c),起点a,终点b,边长c。如果结点a和结点b不连通(用并查集来维护),则将这条边加入到集合S中。

kruskal算法的时间复杂度为O(mlogm),它用来解决稀疏图的最小生成树问题。

2 模板

int n, m;       // n是点数,m是边数
int p[N];       // 并查集的父节点数组struct Edge     // 存储边
{int a, b, w;bool operator< (const Edge &W)const{return w < W.w;}
}edges[M];int find(int x)     // 并查集核心操作
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int kruskal()
{sort(edges, edges + m);for (int i = 1; i <= n; i ++ ) p[i] = i;    // 初始化并查集int res = 0, cnt = 0;for (int i = 0; i < m; i ++ ){int a = edges[i].a, b = edges[i].b, w = edges[i].w;a = find(a), b = find(b);if (a != b)     // 如果两个连通块不连通,则将这两个连通块合并{p[a] = b;res += w;cnt ++ ;}}if (cnt < n - 1) return INF;return res;
}

3 工程化

题目1:求最小生成树。

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 2e5 + 10;
int p[N];
int n, m;struct Edge {int a, b, w;bool operator< (const Edge& W) const {return w < W.w;}
}edges[N];int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {cin >> edges[i].a >> edges[i].b >> edges[i].w;}//初始化并查集for (int i = 1; i <= n; ++i) p[i] = i;sort(edges, edges + m);int res = 0, cnt = 0;for (int i = 0; i < m; ++i) {int a = edges[i].a, b = edges[i].b, w = edges[i].w;a = find(a);b = find(b);if (a != b) {p[a] = b;res += w;cnt ++;}}if (cnt < n-1) {cout << "impossible" << endl;} else {cout << res << endl;}return 0;
}
http://www.lryc.cn/news/226392.html

相关文章:

  • 微信H5跳转微信小程序
  • Yii2 引入 外部无命名空间的类,Class not found
  • 设计模式是测试模式咩?
  • Aspose.OCR for .NET 2023Crack
  • conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!
  • 后端面试问题(学习版)
  • 数据管理系统-week1-介绍
  • 【SpringBoot】手写模拟SpringBoot核心流程
  • 应对.locked勒索病毒:恢复、预防全方位攻略
  • 基于DS1302时钟液晶12864显示2路闹钟仿真及源程序
  • AGC034E Complete Compress
  • python设计模式12:状态模式
  • JS对图片尺寸和DPI进行编辑修改(1寸照修改为2寸照)
  • EDA实验----四选一多路选择器设计(QuartusII)
  • 从windows iso文件中提取install.wim
  • Python的flask网页编程的GET和POST方法的区别
  • 15 # 手写 throttle 节流方法
  • puzzle(1612)拼单词、wordlegame
  • 【解决方案】pytion 运行时提示 import psutil ModuleNotFoundError: No module named ‘psutil‘
  • CSS3 过度效果、动画、多列
  • java使用geotools解析矢量数据kml、geojson、shp文件
  • 原生 JS DOM 常用操作大全
  • 昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈
  • Aria2 任意文件写入漏洞复现
  • 思维模型 多看效应
  • 持续集成交付CICD:Jenkins Pipeline与远程构建触发器
  • 【无标题(PC+WAP)花卉租赁盆栽绿植类pbootcms站模板
  • pytorch 学习率衰减策略
  • Flink SQL -- 概述
  • Spring RabbitMQ那些事(1-交换机配置消息发送订阅实操)