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

第三章 图论 No.4最小生成树的简单应用

文章目录

      • 裸题:1140. 最短网络
      • 裸题:1141. 局域网
      • 裸题:1142. 繁忙的都市
      • 裸题:1143. 联络员
      • 有些麻烦的裸题:1144. 连接格点

存在边权为负的情况下,无法求最小生成树

image.png

裸题:1140. 最短网络

1140. 最短网络 - AcWing题库
image.png
套个prim的板子即可

#include <iostream>
#include <cstring>
using namespace std;const int N = 110, INF = 0x3f3f3f3f;
int g[N][N];
int dis[N]; bool st[N];
int n;int prim()
{memset(dis, 0x3f, sizeof(dis));int res = 0;for (int i = 0; i < n; ++ i ){int x = -1;for (int j = 1; j <= n; ++ j ) if (!st[j] && (x == -1 || dis[x] > dis[j])) x = j;st[x] = true;if (i && dis[x] == INF) return INF;if (i) res += dis[x];for (int y = 1; y <= n; ++ y )dis[y] = min(dis[y], g[x][y]);}return res;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++ i )for (int j = 1; j <= n; ++ j )scanf("%d", &g[i][j]);printf("%d\n", prim());return 0;
}

裸题:1141. 局域网

1141. 局域网 - AcWing题库
image.png

裸题,稀疏图,套个kruskal的板子就行
需要注意的是:题目给定的图可能存在多个连通块,若使用prim算法,需要对每个连通块求最小生成树,但是使用kruskal能直接求出所有连通块的最小生成树

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 110, M = 210;
struct Edge
{int x, y, w;bool operator<(const Edge& e) const {return w < e.w;}
}edges[M];int p[N];
int n, m;int find(int x)
{if (x != p[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 cnt = 0, res = 0;for (int i = 0; i < m; ++ i ){auto t = edges[i];int x = edges[i].x, y = edges[i].y, w = edges[i].w;x = find(x), y = find(y);if (x != y){cnt ++ ;res += w;p[x] = y;}}return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < m; ++ i )scanf("%d%d%d", &edges[i].x, &edges[i].y, &edges[i].w);int sum = 0;for (int i = 0; i < m; ++ i ) sum += edges[i].w;printf("%d\n", sum - kruskal());return 0;
}

裸题:1142. 繁忙的都市

1142. 繁忙的都市 - AcWing题库
依然是套kruskal的板子
image.png

#include <iostream>
#include <algorithm>
using namespace std;const int N = 310 ,M = 8010;
struct Edge
{int x, y, w;bool operator<(const Edge& e) const{return w < e.w;}
}edges[M];int n, m;
int p[N];int find(int x)
{if (x != p[x]) p[x] = find(p[x]);return p[x];
}int kruskal()
{sort(edges, edges + m);int res = 0;for (int i = 1; i <= n; ++ i ) p[i] = i;for (int i = 0; i < m; ++ i ){auto t = edges[i];int x = t.x, y = t.y, w = t.w;x = find(x), y = find(y);if (x != y){res = max(res, w);p[x] = y;}}return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < m; ++ i )scanf("%d%d%d", &edges[i].x, &edges[i].y, &edges[i].w);printf("%d %d\n", n - 1, kruskal());return 0;
}

裸题:1143. 联络员

1143. 联络员 - AcWing题库
image.png

添加所有必选的边,维护并查集,然后再对非必选的边做kruskal


#include <iostream>
#include <algorithm>
using namespace std;const int N = 2010, M = 10010;
struct Edge
{int x, y, w;bool operator<(const Edge& e) const {return w < e.w;}
}edges[M];int n, m, cnt;
int p[N];int find(int x)
{if (x != p[x]) p[x] = find(p[x]);return p[x];
}int kruskal()
{int res = 0;for (int i = 0; i < cnt; ++ i ){auto t = edges[i];int x = t.x, y = t.y, w = t.w;x = find(x), y = find(y);if (x != y){res += w;p[x] = y;}}return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++ i ) p[i] = i;int t, x, y, d;int res = 0;while ( m -- ){scanf("%d%d%d%d", &t, &x, &y, &d);if (t == 1){x = find(x), y = find(y);if (x != y) p[x] = y;res += d;}else{edges[cnt].x = x, edges[cnt].y = y, edges[cnt].w = d;cnt ++ ;}}sort(edges, edges + cnt);res += kruskal();printf("%d\n", res);return 0;
}

有些麻烦的裸题:1144. 连接格点

1144. 连接格点 - AcWing题库
image.png

点阵为图中的点,将二维坐标转换成一维,作为点的编号
添加已有连线后,做kruskal即可

#include <iostream>
#include <algorithm>
using namespace std;const int N = 1010;
struct Edge
{int x, y, w;bool operator<(const Edge& e) const {return w < e.w;}
}edges[2 * N * N];int n, m, cnt = 1;
int p[N * N];
int g[N][N]; // 二维到一维
int dx[3] = { 0, 1, 0 }, dy[3] = { 0, 0, 1 };int find(int x)
{if (x != p[x]) p[x] = find(p[x]);return p[x];
}int kruskal()
{int res = 0;for (int i = 0; i < cnt; ++ i ){auto t = edges[i];int x = t.x, y = t.y, w = t.w;x = find(x), y = find(y);if (x != y){res += w;p[x] = y;}}return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++ i )for (int j = 1; j <= m; ++ j )g[i][j] = cnt ++ ;for (int i = 1; i < cnt; ++ i ) p[i] = i;int x1, x2, y1, y2;while (~scanf("%d%d%d%d", &x1, &y1, &x2, &y2)){int x = g[x1][y1], y = g[x2][y2];x = find(x), y = find(y);if (x != y) p[x] = y;}cnt = 0;for (int i = 1; i <= n; ++ i )for (int j = 1; j <= m; ++ j )for (int k = 1; k <= 2; ++ k ){int a = i + dx[k], b = j + dy[k];if (a >= 1 && a <= n && b >= 1 && b <= m){int x = g[i][j], y = g[a][b];edges[cnt ++ ] = { x, y, k };}}sort(edges, edges + cnt);printf("%d\n", kruskal());return 0;
}

debug:n * m的矩阵中,相邻两点之间存在一条边,那么矩阵中的边数应该为m(n-1) + n(m-1),大概就是2 * n * n,数组开小了导致SF
尽量不要在for循环中定义除了循环变量之外的变量

image.png
需要注意的是,200万条边进行排序会消耗很多时间,由于边的权值只有1和2,所以可以先添加权值为1的边,再添加权值为2的边

相关文章:

第三章 图论 No.4最小生成树的简单应用

文章目录 裸题&#xff1a;1140. 最短网络裸题&#xff1a;1141. 局域网裸题&#xff1a;1142. 繁忙的都市裸题&#xff1a;1143. 联络员有些麻烦的裸题&#xff1a;1144. 连接格点 存在边权为负的情况下&#xff0c;无法求最小生成树 裸题&#xff1a;1140. 最短网络 1140. 最…...

微服务-nacos配置管理

Nacos配置管理 统一配置管理&#xff1a;一次配置更改并支持热更新。将核心配置存储到配置管理服务&#xff0c;当微服务启动时会自动读取配置管理服务中的配置信息并结合本地配置启动。当配置改动时&#xff0c;配置管理服务会自动通知微服务&#xff0c;微服务读取新配置并自…...

【开发问题】flink的sql任务,用命令行执行

flink-sql 命令行flink-sql的客户端sql文件地址sql的内容 命令行 /mnt/flink/flink-1.17.1/bin/sql-client.sh embedded -f /mnt/flink/flink-1.17.1/examples/sql/oracle2Oracle flink-sql的客户端 /mnt/flink/flink-1.17.1/bin/sql-client.shsql文件地址 /mnt/flink/flink-1…...

Git常见问题

git clone 提示OpenSSL SSL_read git clone 时提示Connection was reset, errno 10054类错误 fatal: unable to acce ss https://github.com/fex-team/ueditor.git/: OpenSSL SSL_read: Connection was reset, errno 10054 备注&#xff1a;以下方法只是归纳整理&#xff0c;…...

Android如何实现开机自启

开机自启有很多种办法&#xff0c;下面用广播的方式实现。 1、首先先创建广播&#xff0c;开机代码 /*** Created by Forrest.* User: Administrator* Date: 2023/3/6* Description:*/ public class BootCompleteReceiver extends BroadcastReceiver {Overridepublic void on…...

Java数组实现的简单点名器

Java数组实现的简单点名器 需求分析代码实现小结Time 需求分析 Java数组实现的简单点名器 用数组将名单存储&#xff0c;然后调用Random函数取随机数实现随机点名。 代码实现 import java.util.Random;public class DianMingDemo {public static void main(String[] args) {//…...

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…...

网站无法访问的常见原因

有多种问题可能会阻止用户访问您的网站。本文将解决无法访问网站&#xff0c;且没有错误消息指示确切问题的情况&#xff0c;希望对您有所帮助。 无法访问网站的常见原因有&#xff1a; (1)DNS 设置不正确。 (2)域名已过期。 (3)空白或没有索引文件。 (4)网络连接问题。 DNS 设…...

(树) 剑指 Offer 34. 二叉树中和为某一值的路径 ——【Leetcode每日一题】

❓ 剑指 Offer 34. 二叉树中和为某一值的路径 难度&#xff1a;中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a…...

HDFS集群滚动升级以及回滚相关

HDFS集群滚动升级以及回滚相关 介绍不停机滚动升级非联邦HA集群联邦HA集群 停机升级--非HA集群HDFS集群降级和回滚异同点共同点不同点 HA集群降级&#xff08;downgrade&#xff09;注意事项 集群回滚操作 介绍 在hadoop v2中&#xff0c;HDFS支持namenode高可用&#xff08;H…...

【LeetCode】094. 分割回文串II

文章目录 1. 解题思路1.1 创建dp表1.2 状态转移方程1.3 提前求出所有子串是否是回文串 2. 整体代码 1. 解题思路 1.1 创建dp表 这道题我们使用动态规划的方法来解&#xff0c;首先创建一个大小为字符串长度的dp表。dp[i] 表示 s[0, i] 的字符串最小划分多少次可以全划分为回文…...

CBCGPRibbon 添加背景图片

resource.h中声明资源的ID&#xff1a;ID_RIBBON_BACKIMAGE rc文件中添加png图片路径&#xff1a; ID_RIBBON_BACKIMAGE PNG DISCARDABLE "res\\bkribbon.png" 代码中添加下测&#xff1a; //添加背景图片 m_wndRibbonBar.SetBackgroundImage(ID_RIB…...

无涯教程-Perl - last 语句函数

当在循环内遇到 last 语句时&#xff0c;循环立即终止&#xff0c;程序控制在循环后的下一条语句处恢复。您可以为LABEL提供最后一个语句&#xff0c;其中LABEL是循环的标签。 last 语句可以在嵌套循环内使用&#xff0c;如果未指定LABEL&#xff0c;则该语句将适用于最近的循环…...

网络安全 Day13-Linux三剑客awk知识

Linux三剑客awk知识 1. awk 介绍2. awk 语法3. 练习 1. awk 介绍 awk 是一门语言, 也是一个命令,Linux 有三剑客命令: grep/sed/awk三剑客的特长 grep 过滤内容sed 取行awk 取列 2. awk 语法 取列 取第一列文件($1): awk {print $1} 文件指定分隔符为文件: awk -F "指…...

java讲解Spring Boot配置文件级别 相互覆盖关系 解决一方不愿意给数据库密码 一方不愿意给源码时 数据库配置问题

前面 我们讲过Spring Boot 修改临时变量的方式 但另一个场景 就是 我们 在本地开发环境 用的是一个配置 但如果项目经理上线 他想改这些配置 怎么弄呢 特别是数据库之类的配置 很多线上是不太一样的 那么 我们先看一个比较基本的方法 在配置文件的同目录下创建一个目录 叫 con…...

点击表格行高亮

css中三元表达式 :class"[activeIndex index ? color : , item]"点击行高亮 <div click"actvied(index)" :class"[activeIndex index ? color : , item]"v-for"(item, index) in tableData" :key"index">{{ item…...

基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、讲解 &#x1f4a5;1 概述 由于能源的日益匮乏&#xff0c;电力需求的不断增长等&#xff0c;配电网中分布式能源渗透率不断提高&#xff0c;且逐渐向主动配电网方…...

零代码爬虫平台SpiderFlow的安装

什么是 Spider Flow &#xff1f; Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫。该工具支持多数据源、自动保存至数据库、任务监控、抓取 JS 动态渲染页面、插件扩展&#xff08;OCR 识别、邮…...

Java 与其他编程语言:比较分析

Java 擅长可移植性和可靠性&#xff0c;Python 擅长通用性和简单性&#xff0c;JavaScript 擅长 Web 开发&#xff0c;C 擅长性能&#xff0c;Go 擅长效率。 在广阔的软件开发世界中&#xff0c;选择正确的编程语言对于任何项目的成功都至关重要。Java 是一种以其多功能性和可移…...

Linux性能分析工具介绍(二)--内存、进程、磁盘、IO分析

目录 一、引言 二、Linux性能分析工具介绍 ------>2.1、进程 ------>2.2、内存 ------>2.3、磁盘 ------>2.4、IO 一、引言 本章从内存、IO、进程的角度,分析linux系统的性能 二、Linux性能分析工具介绍 2.1、进程 2.1.1、top top命令可以动态查看进程…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...