NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)
P3385 【模板】负环 - 洛谷
如果图中存在负环,那么有可能不存在最短路。
![![[Pasted image 20250416144354.png]]](https://i-blog.csdnimg.cn/direct/4a719cda4d394f3a91764ae4b135894f.png)
BF算法判断负环
- 执⾏n轮松弛操作,如果第n轮还存在松弛操作,那么就有负环。
#include <bits/stdc++.h>
using namespace std;const int N = 2e3 + 10, M = 3e3 + 10;int n, m;
int pos;
struct node
{int u, v, w;
}e[M * 2];int dist[N];bool bf()
{//初始化memset(dist, 0x3f, sizeof dist);dist[1] = 0;bool flg;for (int i = 1; i <= n; i++){flg = false;for (int j = 1; j <= pos; j++){int u = e[j].u, v = e[j].v, w = e[j].w;if (dist[u] == 0x3f3f3f3f) continue;if (dist[u] + w < dist[v]){flg = true;dist[v] = dist[u] + w;}}if (flg == false) return flg;}return flg;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T; cin >> T;while (T--){cin >> n >> m;pos = 0;for (int i = 1; i <= m; i++){int u, v, w; cin >> u >> v >> w;pos++;e[pos].u = u, e[pos].v = v, e[pos].w = w;if (w >= 0){pos++;e[pos].u = v, e[pos].v = u, e[pos].w = w;}}if (bf()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
spfa算法判断负环
- 维护⼀个 cnt 数组记录从起点到该点所经过的边数,如果
cnt[i] >= n,说明有负环
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;const int N = 2e3 + 10, M = 3e3 + 10;int n, m;
vector<PII> edges[N];int dist[N];
bool st[N]; //标记在队列中
int cnt[N];bool spfa()
{//初始化memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);memset(cnt, 0, sizeof cnt);queue<int> q;q.push(1);dist[1] = 0;st[1] = true;while (q.size()){auto u = q.front(); q.pop();st[u] = false;for (auto& t : edges[u]){int v = t.first, w = t.second;if (dist[u] + w < dist[v]){dist[v] = dist[u] + w;cnt[v] = cnt[u] + 1;if (cnt[v] >= n) return true;if (!st[v]){q.push(v);st[v] = true;}}}}return false;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T; cin >> T;while (T--){cin >> n >> m;for (int i = 1; i <= n; i++) edges[i].clear();for (int i = 1; i <= m; i++){int u, v, w; cin >> u >> v >> w;edges[u].push_back({v, w});if (w >= 0) edges[v].push_back({u, w});}if (spfa()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
| 常规版-dijkstra | 堆优化-dijkstra | bellman‒ford算法 | spfa算法 | |
| 算法思想 | 贪⼼ • 每次拿出还未确定 最短路的点中,距离起点最近的点; • 打上标记之后,更新出边所连点的最短路。 | 使⽤堆优化找点操作: • 把还未确定最短路的点扔到堆中,⽤堆快速找出距离起点最近的点。 | 暴⼒松弛: • 执⾏n-1轮松弛操作; • 每次都扫描所有的边,看看能否松弛。 | 使⽤队列优化bf算 法: • 只有上⼀轮被松弛的点,下⼀轮才有可能松弛。 |
| 负边权 | 失效 | 失效 | 可⾏ | 可⾏ |
| 负环 | 失效 | 失效 | 可以判断负环: • 执⾏n轮操作,判断是否松弛 | 可以判断负环: • 创建cnt数组, 标记从起点到该 点的边数 |
| 时间复杂度 | O(n2) | O(mlog m) | O(nm) | O(km) ~O(nm) |
其实还有两个单源最短路算法,那就是普通bfs以及01bfs:
- 普通bfs只能处理边权全部相同且⾮负的最短路;
- 01bfs只能解决边权要么为0,要么为1的情况
P1629 邮递员送信 - 洛谷
从起点找别的点的最短距离很简单,直接跑各种最短路算法均可。
但是从别的点回到起点的最短路,如果直接求时间复杂度巨⾼。思考⼀件事:
- 假设从某⼀点z,到达起点的最短路径为:z->y->x->s;
- 那么反过来就是s->x->y->z的最短路径。
因此,仅需对原图的所有图建⽴⼀个"反图",然后跑⼀遍最短路即可。这就是建"反图"的技巧
#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 10;int n, m;
int e[N][N];int dist[N];
bool st[N];void dijkstra()
{memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);dist[1] = 0;for (int i = 1; i <= n; i++){int a = 0;for (int j = 1; j <= n; j++)if (!st[j] && dist[j] < dist[a])a = j;st[a] = true;for (int b = 1; b <= n; b++){int c = e[a][b];if (dist[a] + c < dist[b]){dist[b] = dist[a] + c;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;memset(e, 0x3f, sizeof e);for (int i = 1; i <= m; i++){int a, b, c; cin >> a >> b >> c;e[a][b] = min(e[a][b], c);}dijkstra();int ret = 0;for (int i = 1; i <= n; i++) ret += dist[i];//反图for (int i = 1; i <= n; i++)for (int j = i+1; j <= n; j++)swap(e[i][j], e[j][i]);dijkstra();for (int i = 1; i <= n; i++) ret += dist[i];cout << ret << endl;return 0;
}
P1744 采购特价商品 - 洛谷
看数据范围,所有的最短路算法均可解决,这⾥使⽤BF算法。
⽆需建图,只⽤把所有的边存下来。注意是⽆向边,所以要存两次,空间也要开两倍。
在所有边上做⼀次bf算法,输出结果即可
#include <bits/stdc++.h>
using namespace std;const int N = 110, M = 1010;int n, m, s, t;
double x[N], y[N];struct node
{int a, b;double c;
}e[M];double calc(int i, int j)
{double dx = x[i] - x[j];double dy = y[i] - y[j];return sqrt(dx * dx + dy * dy);
}double dist[N];void bf()
{for (int i = 1; i <= n; i++) dist[i] = 1e10;dist[s] = 0;for (int i = 1; i < n; i++){for (int j = 1; j <= m; j++){int a = e[j].a, b = e[j].b;double c = e[j].c;if (dist[a] + c < dist[b]){dist[b] = dist[a] + c;}if (dist[b] + c < dist[a]){dist[a] = dist[b] + c;}}}
}int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];cin >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;e[i].a = a; e[i].b = b; e[i].c = calc(a, b);}cin >> s >> t;bf();printf("%.2lf\n", dist[t]);return 0;
}
P2136 拉近距离 - 洛谷
bf算法判断负环即可。但要注意⼀下细节:
- 题⽬中给的是距离w是能缩⼩的数,因此存边的时候,应该存成相反数;
- 爱情是双向奔赴的,我们要在1->n和n->1两种情况⾥⾯选择最⼩值
#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 10, M = 1e4 + 10;int n, m;
struct node
{int a, b, c;
}e[M];int dist[N];bool bf(int s)
{memset(dist, 0x3f, sizeof dist);dist[s] = 0;bool flg;for (int i = 1; i <= n; i++){flg = false;for (int j = 1; j <= m; j++){int a = e[j].a, b = e[j].b, c = e[j].c;if (dist[a] + c < dist[b]){flg = true;dist[b] = dist[a] + c;}}if (flg == false) return flg;}return flg;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){cin >> e[i].a >> e[i].b >> e[i].c;e[i].c = -e[i].c;}int ret;bool st = bf(1);if (st){cout << "Forever love" << endl;return 0;}ret = dist[n];st = bf(n);if (st){cout << "Forever love" << endl;return 0;}cout << min(ret, dist[1]) << endl;return 0;
}
P1144 最短路计数 - 洛谷
解法⼀:bfs+动态规划
- 因为边权全都相等,所以可以⽤bfs找出最短路;
- 在bfs找最短路的过程中,更新最短路的条数。
动态规划:
- 状态表⽰:设
f[i]表⽰从起点⾛到 i 点的最短路的条数。 - 状态转移⽅程:
f[i] += f[prev]。
其中prev表⽰ i 点的所有前驱,但是要注意是通过最短路过来的前驱。 - 填表顺序:按照bfs的顺序填表。
解法⼆:dijkstra算法+动态规划
这种解法更通⽤,因为即使边权不相等,也可以⽤dj算法
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int N = 1e6 + 10, M = 2e6 + 10, MOD = 100003;int n, m;
vector<int> edges[N];int dist[N];
bool st[N];
int f[N];void bfs()
{memset(dist, 0x3f, sizeof dist);queue<int> q;q.push(1);dist[1] = 0;f[1] = 1;while (q.size()){auto a = q.front(); q.pop();for (auto b : edges[a]){if (dist[a] + 1 < dist[b]){dist[b] = dist[a] + 1;f[b] = f[a];q.push(b);}else if (dist[a] + 1 == dist[b]){f[b] = (f[b] + f[a]) % MOD;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;edges[a].push_back(b);edges[b].push_back(a);}bfs();for (int i = 1; i <= n; i++) cout << f[i] << endl;return 0;
}
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int N = 1e6 + 10, M = 2e6 + 10, MOD = 100003;int n, m;
vector<int> edges[N];int dist[N];
bool st[N];
int f[N];void dijkstra()
{memset(dist, 0x3f, sizeof dist);priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 1});dist[1] = 0;f[1] = 1;while (heap.size()){auto t = heap.top(); heap.pop();int a = t.second;if (st[a]) continue;st[a] = true;for (auto b : edges[a]){if (dist[a] + 1 < dist[b]){dist[b] = dist[a] + 1;f[b] = f[a];heap.push({dist[b], b});}else if (dist[a] + 1 == dist[b]){f[b] = (f[a] + f[b]) % MOD;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;edges[a].push_back(b);edges[b].push_back(a);}dijkstra();for (int i = 1; i <= n; i++) cout << f[i] << endl;return 0;
}
相关文章:
NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)
P3385 【模板】负环 - 洛谷 如果图中存在负环,那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作,如果第n轮还存在松弛操作,那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…...
ROS2模块库概览
一、核心通信与基础库(最常用) 客户端库 rclcpp (ROS Client Library for C) 核心API:create_node(), create_publisher(), create_subscription()高级特性: 生命周期节点:通过rclcpp_lifecycle实现configure/activate…...
在机器视觉检测中为何选择线阵工业相机?
线阵工业相机,顾名思义是成像传感器呈“线”状的。虽然也是二维图像,但极宽,几千个像素的宽度,而高度却只有几个像素的而已。一般在两种情况下使用这种相机: 1. 被测视野为细长的带状,多用于滚筒上检测的问…...
Linux应急中常用命令
pwdx {pid} 提供进程的 当前工作目录,即进程正在操作的目录。它显示的是进程的运行时工作目录,而不是启动时的可执行文件路径。等同于ls -al /proc//cwdps -aux 和 top 都是用来查看 Linux 系统中进程的命令,但它们的功能、输出格式和使用场景…...
Node.js 文件读取与复制相关内容
Node.js 文件读取与复制相关内容的系统总结,包括 同步读取、异步读取、流式读取、复制操作、两者对比及内存测试。 🧩 一、Node.js 文件读取方式总结 Node.js 使用 fs(文件系统)模块进行文件操作: 1. 同步读取&#…...
数据结构-串
串是数据结构中一种重要的数据类型,广泛应用于文本处理、信息检索等领域。本文将从串的基本概念、存储实现、应用举例以及总结核心知识点四个方面进行详细讲解,帮助大家更好地理解和掌握串这一数据结构。 一、串的基本概念及其抽象数据类型 1.1 串的定…...
Windows 下 MongoDB ZIP 版本安装指南
在开发和生产环境中,MongoDB 是一种非常流行的 NoSQL 数据库,以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说,MongoDB 提供了多种安装方式,其中 ZIP 版本因其灵活性和轻量级的特点,成为很多开发者的首选…...
在 Spring Boot 中实现服务器端推送(SSE):两种方法的比较与实践
在现代 Web 应用中,实时数据推送是一个常见的需求。无论是实时消息通知、股票行情更新,还是在线游戏的实时数据交互,服务器端推送(Server-Sent Events,简称 SSE)都是一种高效且易于实现的解决方案。在 Spri…...
2025年十六届蓝桥杯Python B组原题及代码解析
相关试题可以在洛谷上测试用例: 2025 十六届 蓝桥杯 Python B组 试题 A:攻击次数 答案:103 print(103)代码: # 初始化敌人的血量 x 2025# 初始化回合数 turn 0# 模拟攻击过程 while x > 0:# 回合数加一turn 1# 第一个英…...
数据清洗到底在清洗什么?
在大数据时代,数据是每个企业的五星资产,被誉为“新石油”,但未经处理的数据往往参杂着大量“杂质”。这些“脏数据”不仅影响分析结果,严重的甚至误导企业决策。数据清洗作为数据预处理的关键环节,正是通过“去芜存菁…...
Microsoft Azure 基础知识简介
Microsoft Azure 基础知识简介 已完成100 XP 2 分钟 Microsoft Azure 是一个云计算平台,提供一系列不断扩展的服务,可帮助你构建解决方案来满足业务目标。 Azure 服务支持从简单到复杂的一切内容。 Azure 具有简单的 Web 服务,用于在云中托…...
mysql表类型查询
普通表 SELECT table_schema AS database_name,table_name FROM information_schema.tables WHERE table_schema NOT IN (information_schema, mysql, performance_schema, sys)AND table_type BASE TABLEAND table_name NOT IN (SELECT DISTINCT table_name FROM informatio…...
数据库ALGORITHM = INSTANT研究过程
背景 偶然在团队中发现同事大量使用 ALGORITHM INSTANT 更新字段,根据固有的理解,平时字段的更新必然会涉及到表结构的更改,印象中数据库会加入MDL锁去保证表数据的一致性。 但是听说在Mysql8.0特性中,表明在更新字段的时候此方法…...
n8n 为技术团队打造的安全工作流自动化平台
AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...
基于Python的App流量大数据分析与可视化方案
一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…...
【Linux 并发与竞争实验】
【Linux 并发与竞争实验】 之前学习了四种常用的处理并发和竞争的机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。 文章目录 【Linux 并发与竞争实验】1.原子操作实验1.1 实验程序编写1.2 运行测试 2.自旋锁实验…...
wx219基于ssm+vue+uniapp的教师管理系统小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
leetcode0079. 单词搜索-medium
1 题目: 单词搜索 官方标定难度:中 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字…...
SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...
复数概念的演进 3 —— 复数的意义
注:本文为 “从三次方程到复平面:复数概念的演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第 3 篇。 生料合辑,同主题文章未整理去重。 机翻,未校。 Complex number and its discovery history 复数及其发…...
三菱PLC
三菱PLC通信协议及读写 引言 三菱PLC(Programmable Logic Controller,可编程逻辑控制器)是工业自动化领域中广泛使用的一款PLC品牌。三菱PLC支持多种通信协议,包括Modbus、Ethernet/IP、Melsec Net等。本文将详细介绍三菱PLC的通…...
B端可视化方案,如何助力企业精准决策,抢占市场先机
在当今竞争激烈的商业环境中,企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘,帮助企业管理层和业务人员快速理解数据背后的业务逻辑,从而做出精准决策。本文将深入探讨B端可视化方…...
0701表单组件-react-仿低代码平台项目
文章目录 1 react表单组件1.1 受控组件 (Controlled Components)示例代码: 1.2 非受控组件 (Uncontrolled Components)示例代码: 2 AntD表单组件实战2.1 开发搜索功能2.2 开发注册页2.3 开发登录页2.4 表单组件校验 结语 1 react表单组件 input表单组件…...
【adb】bat批处理+adb 自动亮屏,自动解锁屏幕,启动王者荣耀
准备adb 下载 需要确认是否安装了adb.exe文件,可以在: 任务管理器 -->详细信息–>找一下后台运行的adb 安装过anroid模拟器,也存在adb,例如:雷电安装目录 D:\leidian\LDPlayer9 单独下载adb 官方下载地址:[官方网址] 下载目录文件: 测试adb USB连接手机 首先在设置界…...
Distortion, Animation Raymarching
这节课的主要目的是对uv进行操作,实现一些动画的效果,实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…...
SpringBoot整合POI实现Excel文件的导出与导入
使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI实现Excel文件的导出与导入》 《SpringMVC实现文件的上传与下载》 《C#使用NPOI导出Excel文件》 《NPOI使用手册》 1、Apache POI 的介绍 Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格…...
LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)
【LetMeFly】2537.统计好子数组的数目:滑动窗口(双指针) 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-good-subarrays/ 给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果…...
矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵
GPU渲染过程 矩阵 什么是矩阵(Matrix) 向量 (3,9,88) 点乘:计算向量夹角 叉乘:计算两个向量构成平面的法向量。 矩阵 矩阵有3行,2列,所以表示为M32 获取固…...
(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案,可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中,方便…...
