图论——最小生成树的扩展应用


最小生成树相关原理

acwing1146.新的开始

假设存在一个“超级发电站”
在每一个矿井修发电站相当于从这个“超级发电站”到各个矿井连一条长度为 v [ i ] v[i] v[i]的边。
这样一来这就是一个最短路的模板题。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 310;
int dist[N];
bool st[N];
int w[N][N];
int n;
int prim()
{memset(dist, 0x3f, sizeof dist);dist[0] = 0;int res = 0;for (int i = 0; i < n + 1; i ++ ){int t = -1;for (int j = 0; j < n + 1; j ++ ){if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;}st[t] = 1;res += dist[t];for (int j = 0; j < n + 1; j ++ )dist[j] = min(dist[j], w[t][j]);}return res;
}
int main()
{cin >> n;for (int i = 1; i <= n; i ++ ){cin >> w[0][i];w[i][0] = w[0][i];}for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )cin >> w[i][j];printf("%d", prim());return 0;
}

acwing1145.北极通讯网络

假设有给定一个 d d d值,将任意两个长度小于等于 d d d的点都进行集合合并,形成 m m m个连通块( m m m 棵最小生成树),则需要 m m m个卫星设备
即找一个最小的 d d d值,使得将所有权值大于 d d d的边删去,之后,整个图形的连通块的个数等于 k k k

显然,连通块的数量和d取值会满足以下这种关系。
在这里插入图片描述
我们考虑kruskal算法,kruskal算法是从大到小枚举每个边,如果该边两端不连通则加入该边,当我们当前枚举的边权为d时,虽然实际上我们只是在小于等于d的边权中选择将能够实现联通的边加入了最小生成树生成了若干连通块,然而实际上这和把边权小于等于d的边全部连起来形成连通块的情况是相同的,也正因此我们上面这个问题和kruskal算法实际上是等价的,我们可以用kruskal算法来做。

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 510, M = N * N / 2;
int fa[N];
int m = 0, cnt;
struct Edge{int a, b;double w;bool operator< (const Edge &t) const{return w < t.w;}
}e[M];
PII q[N];
int n, k;
double get_dist(PII a, PII b)
{double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx * dx + dy * dy);
}
int find(int a)
{return fa[a] == a ? a : fa[a] = find(fa[a]);
}
int main()
{double res = 0;cin >> n >> k;for (int i = 1; i <= n; i ++ )fa[i] = i;for (int i = 1; i <= n; i ++ )cin >> q[i].x >> q[i].y;for (int i = 1; i <= n; i ++ )for (int j = 1; j < i; j ++ )e[++ m] = {i, j, get_dist(q[i], q[j])};cnt = n;sort(e + 1, e + m + 1);for (int i = 1; i <= m; i ++ ){int a = find(e[i].a), b = find(e[i].b);double w = e[i].w;if (cnt <= k) break;if (a == b) continue;fa[a] = b;res = w;cnt -- ;}printf("%.2lf\n", res);return 0;
}

acwing346.走廊泼水节

做法:初始时先将每一个点看成一个大小为1的连通块,这个连通块就可以看成一个完全图(因为只有一个点)
做Kruskal算法,在每循环到一条可以合并两个连通块的边 e e e时,记 e e e的边长为 w w w,为了形成一个完全图,就要使得两个已经是完全图的连通块中的点有边,但是为了使最后的唯一最小生成树还是原来那棵而且,新增的边一定要大于 w w w
假设新边小于 w w w,因为新增边后会成环,当断开边 e e e,形成的树大小会变小,即不是原来那棵,所以不成立
假设新边等于 w w w,同样的断开 e e e,会形成一个大小一样但结构不一样的树,不满足唯一,所以也不成立。
这里我们新增的边权可以为 w + 1 w+1 w+1,因为我们的边权为从小到大枚举,也正因此 w + 1 w+1 w+1不会影响左右两个连通块内部最小生成树的情况。

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 6010, M = N * N / 2;
int fa[N];
int sz[N];
struct Edge{int a, b, w;bool operator< (const Edge &t) const{return w < t.w;}
}e[M];
int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int t;
int main()
{cin >> t;while (t -- ){int n;cin >> n;for (int i = 1; i < n; i ++ ){int a, b, w;cin >> a >> b >> w;e[i] = {a, b, w};}sort(e + 1, e + n);for (int i = 1; i <= n; i ++ ){sz[i] = 1;fa[i] = i;}int res = 0;for (int i = 1; i < n; i ++ ){int a = find(e[i].a), b = find(e[i].b), w = e[i].w;if (a == b) continue;res += (sz[a] * sz[b] - 1) * (w + 1);sz[b] += sz[a];fa[a] = b;}cout << res << endl;}return 0;
}

acwing1148.秘密的牛奶运输

次小生成树的求解方式:
在这里插入图片描述
题解来源:https://www.acwing.com/solution/content/80131/

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 510, M = 10010;
struct Edge{int a, b, w;bool flag;bool operator< (const Edge &t) const{return w < t.w;}
}edge[M];
int fa[N];
int n, m;
int dist1[N][N], dist2[N][N];
int h[N], e[2 * N], ne[2 * N], w[2 * N], tot;
int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void add(int a, int b, int c)
{e[tot] = b, ne[tot] = h[a], w[tot] = c, h[a] = tot ++ ;
}
void dfs(int u, int fa, int maxd1, int maxd2, int d1[], int d2[])
{for (int i = h[u]; ~i; i = ne[i]){int j = e[i];if (j == fa) continue;if (w[i] > maxd1){d1[j] = w[i], d2[j] = maxd1;dfs(j, u, w[i], maxd1, d1, d2);}else if (w[i] < maxd1 && w[i] > maxd2){d1[j] = maxd1, d2[j] = w[i];dfs(j, u, maxd1, w[i], d1, d2);}else{d1[j] = maxd1, d2[j] = maxd2;dfs(j, u, maxd1, maxd2, d1, d2);}}return ;
}
int main()
{cin >> n >> m;for (int i = 1; i <= m; i ++ ){int a, b, w;cin >> a >> b >> w;edge[i] = {a, b, w};}for (int i = 1; i <= n; i ++ )fa[i] = i;sort (edge + 1, edge + 1 + m);memset(h, -1, sizeof h);ll sum = 0;for (int i = 1; i <= m; i ++ ){int a = edge[i].a, b = edge[i].b, w = edge[i].w;int aa = find(a), bb = find(b);if (aa != bb){fa[aa] = bb;sum += w;edge[i].flag = 1;add(a, b, w), add(b, a, w);}}for (int i = 1; i <= n; i ++ )dfs(i, -1, 0, 0, dist1[i], dist2[i]);ll res = 1e18;for (int i = 1; i <= m; i ++ ){if (edge[i].flag) continue;int a = edge[i].a, b = edge[i].b, w = edge[i].w;if (w > dist1[a][b]) res = min(res, sum + w - dist1[a][b]);else if (w > dist2[a][b]) res = min(res, sum + w - dist2[a][b]);}cout << res;return 0;
}

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

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

相关文章

供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇

综述 我们之前在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述文章中针对中台到底是什么进行了描述&#xff0c;对于中台的范围也进行划分&#xff0c;如下图所示&#xff1a; 关于商品中心&#xff0c;我们之前用4篇文章介绍了什么是商品中…

Git图形化工具【lazygit】

简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面&#xff08;TUI&#xff09;工具&#xff0c;它让 Git 操作变得更加直观和高效。 Github地址&#xff1a;https://github.com/jesseduffield/lazygit 主要特点 主要…

为大模型提供webui界面的利器:Open WebUI 完全本地离线部署deepseek r1

为大模型提供webui界面的利器&#xff1a;Open WebUI Open WebUI的官网&#xff1a;&#x1f3e1; Home | Open WebUI 开源代码&#xff1a;WeTab 新标签页 Open WebUI是一个可扩展、功能丰富、用户友好的自托管AI平台&#xff0c;旨在完全离线运行。它支持各种LLM运行程序&am…

全程Kali linux---CTFshow misc入门(14-24)

第十四题&#xff1a; dd命令&#xff1a;dd是一个用于复制和转换数据的命令&#xff0c;它可以对文件、设备等进行操作&#xff0c;在数据备份、转换格式等场景经常使用。 ifmisc14.jpg&#xff1a;if表示 “input file”&#xff08;输入文件&#xff09;&#xff0c;这里指…

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志&#xff08;网络爬虫学习&#xff1a;应用selenium从搜…

C语言连接Mysql

目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一&#xf…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

Ubuntu20.04 磁盘空间扩展教程

Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次&#xff0c;点赞38次&#xff0c;收藏119次。执行命令查看系统容量相关的数据&#xff1a;df -h当前容量为20G&#xff0c;已用18G&#xff08;96%&#xff09;&#xff0c;可用844M&#xff0c;可用…

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎&#xff0c;能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中&#xff0c;Ollama是一个非常方便的工具&#xff0c;它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的&#xff1a; AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MSTP5280 [ZJOI2019] 线段树 AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树&#xff0c;点有点权 w i w_i wi​&am…

Redis学习之哨兵二

一、API 1.sentinel masters:展示被监控的主节点状态及相关的统计信息 2.sentinel master <master name>:展示指定的主节点的状态以及相关的统计信息 3.sentinel slaves <master name>:展示指定主节点的从节点状态以及相关的统计信息 4.sentinel sentinels <mas…

iperf 测 TCP 和 UDP 网络吞吐量

注&#xff1a;本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具&#xff0c;iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制&#xff08;包含AR、ISR、OSR、HW 和 LEO 介绍&#xff09;1. 副本的基本概念2. 副本同步和一致性2.1 AR&#xff08;Assigned Replicas&#xff09;2.2 ISR&#xff08;In-Sync Replicas&#xff09;2.3 OSR&#xff08;Out-of-Sync Replicas&#xf…

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…

github制作静态网页

打开gihub并新建仓库 命名仓库&#xff1a;xxx.github.io 点击create repository进行创建 点击蓝色字体“creating a new file”创建文件 文件命名为index.html, 并编写html 右上角提交 找到setttings/pages&#xff0c;修改路径&#xff0c;点击保存&#xff0c;等…

shell脚本

Shell内容讲解 一、Shell 脚本基础概念 什么是 Shell 脚本&#xff1f; Shell 脚本是一个包含一系列 Shell 命令的文本文件&#xff0c;用于自动化执行任务&#xff08;如文件操作、程序调用、系统管理等&#xff09;。 Shell 类型 bash&#xff08;Bourne-Again Shell&#…

python:斐索实验(Fizeau experiment)

斐索实验&#xff08;Fizeau experiment&#xff09;是在1851年由法国物理学家阿曼德斐索&#xff08;Armand Fizeau&#xff09;进行的一项重要实验&#xff0c;旨在测量光在移动介质中的传播速度。这项实验的结果对当时的物理理论产生了深远的影响&#xff0c;并且在后来的相…

16.Word:石油化工设备技术❗【28】

目录 题目 NO1.2 NO3 NO4 题目 NO1.2 F12&#xff1a;另存为将“Word素材.docx”文件另存为“Word. docx”&#xff08;“docx”为文件扩展名&#xff09; 光标来到表格上方→插入→形状→新建画布→单击选中→格式→高度/宽度&#xff08;格式→大小对话框→取消勾选✔锁定…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

DeepSeek-R1本地部署笔记

文章目录 效果概要下载 ollama终端下载模型【可选】浏览器插件 UIQ: 内存占用高&#xff0c;显存占用不高&#xff0c;正常吗 效果 我的配置如下 E5 2666 V3 AMD 590Gme 可以说是慢的一批了&#xff0c;内存和显卡都太垃圾了&#xff0c;回去用我的新设备再试试 概要 安装…