差分约束 + 01BFS

news/2024/11/29 18:07:03/文章来源:https://www.cnblogs.com/laoshan-plus/p/18577300

属于简单知识点的补档。

差分约束

差分约束系统 是一种特殊的 \(n\) 元一次不等式组,包含 \(n\) 个变量 \(x_1,\dots,x_n\)\(m\) 个约束条件,每个约束条件形如 \(x_i-x_j\le c_k\),其中 \(c_k\) 是常数。我们要解决的问题是求出 \(x_1,\dots,x_n\) 的一组解。

差分约束问题是最短路算法的一种巧妙应用。我们发现,差分约束系统中的每个约束条件 \(x_i-x_j\le c_k\) 都可以变形成 \(x_i\le x_j+c_k\),这不由得让我们想到单源最短路中的三角形不等式 \(\text{dis}(v)\le\text{dis}(u)+w\)。因此,我们把每个未知数 \(x_i\) 看作图中的一个节点,对每一个约束条件 \(x_i-x_j\le c_k\) 连边。

连边方法有两种:

  1. 连一条 \(x_j\to x_i\) 的边权为 \(c_k\) 的边之后跑最短路,最终求出来的解是 \(x_i\le0\) 时所有 \(x\) 的最大值
  2. 连一条 \(x_i\to x_j\) 的边权为 \(-c_k\) 的边之后跑最长路,最终求出来的解是 \(x_i\ge0\) 时所有 \(x\) 的最小值

这两种方法不能混用。

注意这样连完边之后图不一定联通,此时我们只需定义一个 “超级源点” \(0\),并对所有 \(i\) 连 \((0,i,0)\) 的边。然后,跑最短/最长路。

至于题目中要求判断无解,我们只需用 SPFA 判断是否存在负环即可。若存在负环,则无解;否则,\(x_i=\text{dis}(i)\) 就是题目要求的一组解。

例 1 P5960 【模板】差分约束

constexpr int MAXN=5005;
int n,m,head[MAXN],tot;
struct{int v,to,w;
}e[MAXN<<1];
void addedge(int u,int v,int w){e[++tot]={v,head[u],w};head[u]=tot;
}
int dis[MAXN],cnt[MAXN];
bool vis[MAXN];
queue<int>q;
void spfa(){memset(dis,0x3f,sizeof(int)*(n+5));dis[0]=0;vis[0]=1;q.emplace(0);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i;i=e[i].to)if(dis[e[i].v]>dis[u]+e[i].w){dis[e[i].v]=dis[u]+e[i].w;if(!vis[e[i].v]){vis[e[i].v]=1;q.emplace(e[i].v);if(++cnt[e[i].v]>n){puts("NO");exit(0);}}}}
}int main(){n=read(),m=read();for(int i=1,u,v,w;i<=m;++i){u=read(),v=read(),w=read();addedge(v,u,w);}for(int i=1;i<=n;++i) addedge(0,i,0);spfa();for(int i=1;i<=n;++i) write(dis[i],' ');return putchar('\n'),fw,0;
}

例 2 P1993 小 K 的农场

把所有不等式转化为标准形式即可。注意连边方法一定一定不能弄混。

#include<bits/stdc++.h>
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
using namespace std;char buf[1<<20],*p1=buf,*p2=buf;
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
constexpr int MAXN=5005;
int n,m,head[MAXN],tot;
struct{int v,to,w;
}e[MAXN<<1];
void addedge(int u,int v,int w){e[++tot]={v,head[u],w};head[u]=tot;
}
int dis[MAXN],cnt[MAXN];
bool vis[MAXN];
queue<int>q;
void spfa(){memset(dis,0x3f,sizeof(int)*(n+5));dis[0]=0;vis[0]=1;q.emplace(0);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i;i=e[i].to)if(dis[e[i].v]>dis[u]+e[i].w){dis[e[i].v]=dis[u]+e[i].w;if(!vis[e[i].v]){vis[e[i].v]=1;q.emplace(e[i].v);if(++cnt[e[i].v]>=n){puts("No");exit(0);}}}}
}int main(){n=read(),m=read();for(int i=1,op,u,v;i<=m;++i){op=read(),u=read(),v=read();switch(op){case 1: addedge(u,v,-read());break;case 2: addedge(v,u,read());break;case 3: addedge(u,v,0),addedge(v,u,0);break;}}for(int i=1;i<=n;++i) addedge(0,i,0);spfa();return puts("Yes"),0;
}

01BFS

01BFS 用于解决边权只有 \(0\)\(1\) 的最短路问题,复杂度是 \(O(n+m)\) 的,可以避免一般最短路算法的 \(\log\)

方法:用一个双端队列 deque,把边权为 \(0\) 的边放到队首,边权为 \(1\) 的边放到队尾。

例 [AGC056C] 01 Balanced

这道题的主要部分在这篇题解里。这里只放它的 01BFS 部分。

void bfs(){memset(dis,-1,sizeof(int)*(n+5));dis[0]=0;deque<int>q;q.emplace_back(0);while(!q.empty()){int u=q.front();q.pop_front();for(int i=head[u];i;i=e[i].to){if(~dis[e[i].v]) continue;dis[e[i].v]=dis[u]+e[i].w;e[i].w?q.emplace_back(e[i].v):q.emplace_front(e[i].v);}}
}

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

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

相关文章

tp6 url 规则

http://tp.cc/index.php/index/test return view( index, [info => $info, sj=>$sj] );

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

我们用了接近一年的时间完成了基于 OTel Java Agent 的升级重构,并于今年 5 月份发布了 4.x 探针的第一个版本 4.1.0,经过接近半年时间的验证、回归、优化,目前最新的稳定版本 4.1.12[11]已经正式发布,欢迎大家了解使用。作者:陈承 背景 在 2018 年的 2 月,ARMS Java Age…

BIM技术:数字孪生城区建设的加速器

在智慧城市建设的浪潮中,BIM(建筑信息模型)技术以其独特的优势,成为推动数字孪生城区建设的重要技术力量。本文将探讨BIM技术如何成为数字孪生城区建设的加速器,以及其在建设过程中的关键作用。BIM技术与数字孪生城区的融合数字孪生城区是指在数字空间构建一个与实体城市相…

ADF - [01] 概述

题记部分 001 || 简介Azure Data Factory (ADF) 是微软 Azure 云平台提供的一种数据集成服务,它允许用户创建、安排和管理数据管道,以实现从不同来源抽取数据、转换数据并加载到目标存储的过程。这个过程通常被称为 ETL(Extract, Transform, Load)。002 || 适用场景 【1】…

使用Powershell运行脚本报错的处理方法

最近在一台办公电脑上运行powershell脚本时报错如下: 系统上禁止运行脚本。有关详细信息,请参阅 https :/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + .\CreateFolders.ps1 + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : S…

20222408 2021-2022-2 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1实验内容简述 (1)应用SET工具建立冒名网站。 (2)利用ettercap完成DNS欺骗攻击。 (3)结合应用两种技术,使被攻击者会通过域名访问到冒名网站。 (4)结合攻击过程,提出具体防范方法。 1.2学习内容简述 (1)学习SET工具和ettercap工具的使用。 (2)理解A…

Vulnhub sick0s1.1

0x01:端口扫描 主机发现 nmap -sn 192.168.231.0/24全端口扫描 nmap --min-rate 10000 -p- 192.168.231.14122ssh,3128squid-http,但8080http是关闭的Squid 是一个高性能的开源代理服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等。它通常用于以下几种用途: 1、Web代…

Gemini

Gemini: 大规模DNN芯片阵列加速器的布局和架构 摘要 chiplet概要目标Chiplet(芯片阵列)技术允许在单一加速器上集成不断增加的晶体管的数量,在前摩尔定律时代获得了更高的效果,体现了在快速AI迭代进步中需要的大量算力。 但是,这样也引进了更高昂的大包开销,以及大量的d2…

hhdb数据库介绍(10-19)

监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系,同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息,否则只能查看当前服务器与集群组件的所属关系,无法查看服务器与组件程序的状…

IDEA 2024.3 安装激活教程(至2099年)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 要求 在开始之前,请确保您的计算机满足以下系统要求:操作系统:Windows、macOS或Linux 处理器:至少1 GH…

证书安装后为什么还显示证书无效

在数字化时代,网络安全和数据保护变得尤为重要。SSL/TLS证书作为保护网站和用户数据安全的重要工具,其正确安装和有效性是网站运营者必须关注的问题。然而,有时候即使证书已经安装,用户仍然会遇到“证书无效”的提示,这可能由多种原因引起。本文将探讨在证书安装后,为何用…

windows下netstat及网络查看工具的使用

1.打开cmd: win+R 输入cmd 2.查看工具相关指令可以看到相关指令能配置查看的内容 3.查看相应内容 例如我想查看当前主机UDP协议所使用的端口: netstat -ano -p UDP同理查看TCP所使用的端口: netstat -ano -p TCP二、windows 自带的网络监视工具的使用 1.打开资源管理器 快捷键…