图论——spfa判负环

负环

G G G中存在一个回路,该回路边权之和为负数,称之为负环。

spfa求负环

方法1:统计每个点入队次数, 如果某个点入队n次, 说明存在负环。
证明:一个点入队n次,即被更新了n次。一个点每次被更新时所对应最短路的边数一定是递增的,也正因此该点被更新n次那么该点对应的的最短路长度一定大于等于n,即路径上点的个数至少为n+1。根据抽屉原理,路径中至少有一个顶点出现两次, 也就是路径中存在环路。 而算法保证只有距离减少才会更新, 所以环路权值之和为负数。

方法2:统计从起点到任意顶点最短路经过的边数, 若某点对应边数 c n t ≥ n cnt≥n cntn, 则也说明负环。
方法2根据抽屉原理易证。
我们一般采用方法2才求负环。

acwing904.虫洞

spfa求负环模板题

#include <iostream>
#include <cstring>
using namespace std;
const int N = 510, M = 5210;
int h[N], w[M], e[M], ne[M], tot;
int dist[N];
int cnt[N];
bool st[N];
int q[N];
int t;
int n, m, k;
void add(int a, int b, int c)
{e[tot] = b, ne[tot] = h[a], w[tot] = c, h[a] = tot ++ ;
}
bool spfa()
{memset(dist, 0, sizeof dist);memset(st, 0, sizeof st);memset(cnt, 0, sizeof cnt);int hh = 0, tt = 0;for (int i = 1; i <= n; i ++ ){st[i] = 1;q[tt ++ ] = i;}while (hh != tt){int t = q[hh ++ ];if (hh == N) hh = 0;st[t] = 0;for (int i = h[t]; ~i; i = ne[i]){int j = e[i];if (dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];cnt[j] = cnt[t] + 1;if (cnt[j] == n) return true;if (st[j]) continue;st[j] = 1;q[tt ++ ] = j;if (tt == N) tt = 0;}}}return false;
}
int main()
{cin >> t;while (t -- ){cin >> n >> m >> k;tot = 0;memset(h, -1, sizeof h);while (m -- ){int a, b, c;cin >> a >> b >> c;add(a, b, c), add(b, a, c);}while (k -- ){int a, b, c;cin >> a >> b >> c;add(a, b, -c);}bool t = spfa();if (t) puts("YES");else puts("NO");}return 0;
}

acwing361.观光奶牛

本题要求我们求出环中存在的 ∑ f [ i ] ∑ t [ i ] \frac{\sum f[i]}{\sum t[i]} t[i]f[i]的最大值,如果直接对问题进行求解是有难度的,考虑二分答案。首先易知,答案的范围在 [ 1 / 1000 , 1000 ] [1/1000, 1000] [1/1000,1000]之间,假设我们当前二分到的答案为 m i d mid mid,如果 a n s < m i d ans< mid ans<mid,我们可以去左半区间进行寻找,反之我们去右半区间寻找。
∑ f [ i ] ∑ t [ i ] > m i d \frac{\sum f[i]}{\sum t[i]}> mid t[i]f[i]>mid
∑ f [ i ] > m i d ∗ ∑ t [ i ] \sum f[i]> mid*\sum t[i] f[i]>midt[i]
∑ f [ i ] − m i d ∗ ∑ t [ i ] > 0 \sum f[i]-mid*\sum t[i]> 0 f[i]midt[i]>0
∑ ( f [ i ] − m i d ∗ t [ i ] ) > 0 \sum (f[i]-mid*t[i])> 0 (f[i]midt[i])>0
∑ ( m i d ∗ t [ i ] − f [ i ] ) < 0 \sum (mid*t[i]-f[i])< 0 (midt[i]f[i])<0
经过转换后,问题就等价于把图中边权换为 m i d ∗ t [ i ] − f [ i ] mid*t[i]-f[i] midt[i]f[i],然后判断图中是否存在负环,存在负环则说明图中存在 ∑ f [ i ] ∑ t [ i ] > m i d \frac{\sum f[i]}{\sum t[i]}>mid t[i]f[i]>mid的环。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010, M = 5010;
int h[N], e[M], ne[M], tot;
int wf[N], wt[M];
int q[N];
double dist[N];
int cnt[N];
bool st[N];
int n, m;
void add(int a, int b, int c)
{e[tot] = b, ne[tot] = h[a], wt[tot] = c, h[a] = tot ++ ;
}
bool check(double x)
{memset(dist, 0, sizeof dist);memset(st, 0, sizeof st);memset(cnt, 0, sizeof cnt);int hh = 0, tt = 0;for (int i = 1; i <= n; i ++ ){st[i] = 1;q[tt ++ ] = i;}while (hh != tt){int t = q[hh ++ ];if (hh == N) hh = 0;st[t] = 0;for (int i = h[t]; ~i; i = ne[i]){int j = e[i];double w = x * wt[i] - wf[t];if (dist[j] > dist[t] + w){dist[j] = dist[t] + w;cnt[j] = cnt[t] + 1;if (cnt[j] == n) return true;if (st[j]) continue;st[j] = 1;q[tt ++ ] = j;if (tt == N) tt = 0;}}}return false;
}
int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ )cin >> wf[i];memset(h, -1, sizeof h);for (int i = 1; i <= m; i ++ ){int a, b, c;cin >> a >> b >> c;add(a, b, c);}double l = 0, r = 1001;while (r - l > 1e-4){double mid = (l + r) / 2;if (check(mid)) l = mid;else r = mid;}printf("%.2lf", l);return 0;
}

acwing1165.单词环

我们第一感觉是把每一个单词看作一个节点,这样一来节点总数 n = 1 0 5 n=10^5 n=105,最坏情况是所有单词都可以互相进行匹配,这样一来边数 m = 1 0 5 ∗ 1 0 5 = 1 0 10 m=10^5*10^5=10^{10} m=105105=1010,考虑其他建图方式。
我们可以把每个单词看作一条边,这样一来边数 m = 1 0 5 m=10^5 m=105,每个单词开头结尾两个字母为节点,节点总数 n = 26 ∗ 26 = 676 n=26*26=676 n=2626=676
本题要求我们求所有环的 ∑ w [ i ] ∑ 1 \frac{\sum w[i]}{\sum 1} 1w[i]最大值。和上题相同,二分答案,答案区间为 [ 1 / 1000 , 1000 ] [1/1000,1000] [1/1000,1000]
∑ w [ i ] ∑ 1 > m i d \frac{\sum w[i]}{\sum 1}> mid 1w[i]>mid
∑ w [ i ] > m i d \sum w[i]> mid w[i]>mid
∑ w [ i ] − m i d > 0 \sum w[i]-mid> 0 w[i]mid>0
∑ ( w [ i ] − m i d ) > 0 \sum (w[i]-mid)> 0 (w[i]mid)>0
∑ ( m i d − w [ i ] ) < 0 \sum (mid-w[i])< 0 (midw[i])<0
经过转换后,问题就等价于把图中边权换为 m i d − w [ i ] mid-w[i] midw[i],然后判断图中是否存在负环,存在负环则说明图中存在 ∑ w [ i ] ∑ 1 > m i d \frac{\sum w[i]}{\sum 1}>mid 1w[i]>mid的环。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 26 * 26 + 10, M = 100010;
int h[N], e[M], ne[M], w[M], tot;
double dist[N];
bool st[N];
int cnt[N];
int q[N];
char s[1010];
int n;
void add(int a, int b, int c)
{e[tot] = b, ne[tot] = h[a], w[tot] = c, h[a] = tot ++ ;
}
bool check(double mid)
{memset(st, 0, sizeof st);memset(dist, 0, sizeof dist);memset(cnt, 0, sizeof cnt);int hh = 0, tt = 0;for (int i = 0; i < 26 * 26; i ++ ){q[tt ++ ] = i;st[i] = 1;}int count = 0;while (hh != tt){int t = q[hh ++ ];st[t] = 0;if (hh == N) hh = 0;for (int i = h[t]; ~i; i = ne[i]){int j = e[i];double ww = mid - w[i];if (dist[j] > dist[t] + ww){dist[j] = dist[t] + ww;cnt[j] = cnt[t] + 1;if (++ count == 10000) return true;if (cnt[j] == N) return true;if (st[j]) continue;st[j] = 1;q[tt ++ ] = j;if (tt == N) tt = 0;}}}return false;
}
int main()
{while (cin >> n, n){memset(h, -1, sizeof h);tot = 0;for (int i = 1; i <= n; i ++ ){cin >> s;int len = strlen(s);if (len < 2) continue;int ll = (s[0] - 'a') * 26 + s[1] - 'a';int rr = (s[len - 2] - 'a') * 26 +s[len - 1] - 'a';add(ll, rr, len);}double l = 0, r = 1001;if (!check(0)) puts("No solution");else{while (r - l > 1e-4){double mid = (l + r) / 2;if (check(mid)) l = mid;else r = mid;}printf("%.2lf\n", r);}}return 0;
}

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

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

相关文章

设想中的计算机语言:可执行对象的构造函数和析构函数

经典 C语言的内存管理&#xff0c;是一块一块的&#xff0c;用malloc分配内存&#xff0c;用free释放内存。 C有对象&#xff0c;一个对象是好几片内存&#xff0c;用指针连接起来&#xff0c;用构造函数和析构函数管理对象。 创意 如图&#xff0c;是一个“可执行对象”&am…

SAP系统中的主要采购类型/采购模式总结

在 SAP 系统中,采购类型主要有以下几种: 一、标准采购订单(Standard Purchase Order) 描述:这是最常用的采购类型,用于一次性采购货物或服务。采购部门根据需求部门提出的采购申请,向供应商发出采购订单,明确规定了采购的物料、数量、价格、交货日期等详细信息。 应…

我的毕设之路:(2)系统类型的论文写法

一般先进行毕设的设计与实现&#xff0c;再在现成毕设基础上进行描述形成文档&#xff0c;那么论文也就成形了。 1 需求分析&#xff1a;毕业设计根据开题报告和要求进行需求分析和功能确定&#xff0c;区分贴合主题的主要功能和拓展功能能&#xff0c;删除偏离无关紧要的功能…

kamailio-5.8.4-centos9编译

安装必要的依赖包 在开始编译之前&#xff0c;你需要安装编译 Kamailio 所需的一些基础依赖包&#xff1a; dnf install -y make gcc gcc-c flex bison libxml2-devel openssl-devel sqlite-devel mysql-devel pcre-devel libcurl-devel下载并解压 Kamailio 源码包 假设你已经…

spring中解决循环依赖的方法

为了避免这种循环依赖问题&#xff0c;Spring 引入了三级缓存的机制&#xff0c;分为&#xff1a; 一级缓存&#xff08;singletonObjects&#xff09;&#xff1a;这是存放已经完全创建好的单例 Bean 的缓存。当 Bean 完全初始化并且可以被使用时&#xff0c;会存放在这里。 …

SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由

前言 在微服务架构中&#xff0c;API 网关是各个服务之间的入口点&#xff0c;承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理&#xff0c;通常需要通过中心化的配置管理系统来实现灵活的路由更新&#xff0c;而无需重启网关服务。Nacos 作为一个开源…

pycharm(2)

conda 我下载安装conda的时候产生了各种问题&#xff0c;最终我发现&#xff0c;打开杀毒软件会有阻碍 cuda的版本问题很大&#xff0c;我尝试多个版本之后&#xff0c;发现anaconda3-2024.06.1-windows-x86_64安装了之后不会报错&#xff0c;另外pycharm的版本也一直有问题&a…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…

AJAX RSS Reader:技术解析与应用场景

AJAX RSS Reader:技术解析与应用场景 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取感兴趣的信息,RSS(Really Simple Syndication)技术应运而生。AJAX RSS Reader作为一种基于AJAX技术的信息读取工具,在用户体验和信息获取方面具有显著优势。本…

C语言中string.h头文件功能介绍

在C语言的世界里&#xff0c;string.h头文件提供了许多用于处理字符串和内存操作的函数。今天&#xff0c;我们就来深入探讨string.h头文件的功能、使用注意事项以及一些拓展应用。 一、功能介绍 string.h头文件定义了一系列用于操作字符串和内存的函数。这些函数可以分为几个…

Maven的下载安装配置

maven的下载安装配置 maven是什么 Maven 是一个用于 Java 平台的 自动化构建工具&#xff0c;由 Apache 组织提供。它不仅可以用作包管理&#xff0c;还支持项目的开发、打包、测试及部署等一系列行为 Maven的核心功能 项目构建生命周期管理&#xff1a;Maven定义了项目构建…

< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对

信息来源&#xff1a; 文件&#xff1a;/var/log/auth.log 因为在 sshd_config 配置文件中&#xff0c;已经定义 LogLevel INFO 部分内容&#xff1a; 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […

解决幂等问题的4种方案

幂等问题引入与准备工作 幂等概念&#xff1a;幂等指多次操作影响仅与首次执行结果相同&#xff0c;重复执行不会对系统造成额外变化。业务场景问题&#xff1a;以网站金币充值为例&#xff0c;因网络不稳定&#xff0c;支付宝支付成功的异步通知可能多次发送&#xff0c;若商家…

LitServe - 闪电般快速服务AI模型⚡

文章目录 一、关于 LitServe二、快速启动定义服务器测试服务器LLM 服务小结 三、特色示例功能特点 四、性能表现五、托管选项 一、关于 LitServe LitServe是一个易于使用、灵活的服务引擎&#xff0c;适用于基于FastAPI构建的AI模型。批处理、流式传输和GPU自动缩放等功能消除…

小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索

摘要&#xff1a;随着互联网技术的不断发展&#xff0c;小程序电商已成为现代商业的重要组成部分。然而&#xff0c;如何在竞争激烈的市场中增强小程序内容的真实性&#xff0c;提高用户信任度&#xff0c;成为电商运营者面临的一大挑战。本文首先探讨了通过图片、视频等方式增…

AD电路仿真

目录 0 前言 仿真类型 仿真步骤 仿真功能及参数设置 仿真模型 应用优势 1 新建原理图 2 放置元器件及布线 3 放置探头 4 实验结果 Operating Point 分析的作用 DC Sweep 的主要功能 Transient Analysis 的主要功能 AC Analysis 的功能 5 总结 1. 直流工作点分析…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

科技快讯 | 理想官宣:正式收费!WeChat 港币钱包拓宽商户网络;百川智能发布深度思考模型Baichuan-M1-preview

理想官宣&#xff1a;正式收费&#xff01; 1月23日&#xff0c;理想汽车宣布&#xff0c;理想超充站超时占用费正式运营。触发超时占用费的条件为充电结束后15分钟内未将充电枪插回充电桩&#xff0c;收费标准为2元/分钟&#xff0c;单次封顶200元。理想汽车将在充电结束的四个…

Linux网络 | 理解TCP面向字节流、打通socket与文件的关系

前言&#xff1a;我们经常说TCP是面向字节流的&#xff0c; TCP是面向字节流的。 但是&#xff0c; 到底是什么事面向字节流呢&#xff1f; 另外&#xff0c; 我们知道sockfd其实就是文件fd。 但是&#xff0c;为什么sockfd是文件fd呢&#xff1f; 这些问题都在本节内容中的到回…

SQL教程-基础语法

INSERT INTO 新增数据 INSERT INTO 数据表名 VALUES (值1,值2,值3,...) DELETE 删除数据 DELETE FROM 数据表名 WHERE 查询条件 UPDATE 修改数据 UPDATE 数据表名 SET 字段1 值1, 字段2值2, ... WHERE 查询条件 SELECT 查询数据 #查询数据 SELECT 字段1, 字段2, ... FROM 数…