【差分约束】学习笔记

news/2024/12/23 8:52:45/文章来源:https://www.cnblogs.com/Ayaka-0928/p/18623001

Basic Tips

差分约束,即为存在一个差分约束系统,即类似 \(x_i - x_j \leq k\)\(n\) 元一次不等式组,求出一组解使得该组内所有不等式全部成立,即 \(x_1 = s_1,x_2 = s_2 \dots x_n = s_n\),否则判无解。

对于满足条件的一个解集 \(\{s_1,s_2,s_3,\dots,s_n\}\),集合 \(\{s_1 + t,s_2 + t,s_3 + t,\dots,s_n + t\}\) 也满足成为解集的条件。

为何用 spfa 求解?

名副其实,对于每一个不等式 \(x_i - x_j \leq k\),移项可得 \(x_i \leq x_j + k\),与 \(\text{spfa}\) 中的三角不等式极其相似,因此可以看做是 \(x_j\)\(x_i\) 连了一条边权为 \(k\) 的有向边,然后就可以用 \(\text{spfa}\) 求解,若过程中存在负环则差分约束系统无解,否则对于 \(s_i = dis_i\) 即为差分约束系统的一个解。

注:\(\text{spfa}\) 跑最长路还是最短路的情况依据推出的差分约束系统不等式的形式,若为 \(x_i - x_j \leq k\),我们选择最短路,若 \(x_i - x_j \geq k\),我们选择最长路。

other

\(\text{spfa}\) 中的三角不等式 \(disv \geq dis_u + w\) 的解释。

如图:

\(v\) 为终点,\(u\) 为起点,\(v1\) 为中转点,显然,\(u \to v1 \to v\) 的路径是比 \(u \to v\) 的路径长的,因此 \(\text{spfa}\) 的过程可以看成对于每个点的出边做一次这样的操作。

example

P5960 【模板】差分约束

差分约束模板,根据上文所说的过程实现就行,需要注意的是,在没有保证建出的图联通时,需要从超级源点向每一条点连边。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 5e3 + 10;
int n,m,idx=1,head[MAXN << 1];
int dist[MAXN << 1],cnt[MAXN << 1];
bool vis[MAXN << 1];
struct node{int v,w,nxt;
}edge[MAXN << 1];
inline void add(int u,int v,int w){edge[idx].v = v;edge[idx].w = w;edge[idx].nxt = head[u];head[u] = idx ++;
}
inline bool spfa(int s){memset(cnt,0,sizeof cnt);memset(dist,-0x3f,sizeof dist);memset(vis,0,sizeof vis);queue<int>q;vis[s] = 1;dist[s] = 0;q.push(s);while(!q.empty()){int u = q.front();q.pop();vis[u] = 0;for(int i=head[u];i!=-1;i=edge[i].nxt){int v = edge[i].v,w = edge[i].w;if(dist[v] < dist[u] + w){dist[v] = dist[u] + w;if(!vis[v]){cnt[v] = cnt[u] + 1;if(cnt[v] > n + 1)return false;vis[v] = 1;q.push(v);}}}}return true;
}
signed main(){ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;memset(head,-1,sizeof head);for(int i=1;i<=m;i++){int u,v,w;cin >> u >> v >> w;add(u,v,-w);}for(int i=1;i<=n;i++)add(0,i,0);if(!spfa(0))cout << "NO" << endl;else{for(int i=1;i<=n;i++)cout << dist[i] << " ";cout << endl;}return 0;
} 

P4878 [USACO05DEC] Layout G

依据题目中给出的条件列出不等式 。

\( \begin{cases} x_i - x_j \leq d1 \\ x_k - x_p \geq d2 \end{cases} \)

然后建边,由于全图不保证联通,因此需要超级源点,从超级源点跑一次 \(\text{spfa}\) 判无解,另外从 \(1\) 号节点跑统计答案,由于题目中默认条件 \(x_i < x_j(i > j)\),需要将相邻两点连边。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 5e4 + 10;
const int inf = 1e9;
int n,m1,m2,idx = 1,head[MAXN],dis[MAXN],cnt[MAXN];
bool vis[MAXN];
struct node{int v,nxt,w;
}edge[MAXN];
inline void add(int u,int v,int w){edge[idx].v = v;edge[idx].w = w;edge[idx].nxt = head[u];head[u] = idx ++;
}
inline int spfa(int s){memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));memset(cnt,0,sizeof(cnt));queue<int>q;dis[s] = 0;vis[s] = 1;q.push(s);while(!q.empty()){int u = q.front();q.pop();vis[u] = 0;cnt[u] ++;if(cnt[u] > n)return -1;for(int i = head[u];i != -1;i = edge[i].nxt){int v = edge[i].v,w = edge[i].w;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;if(!vis[v]){vis[v] = 1;q.push(v);}}}}if(dis[n] > inf)return -2;return dis[n];
}
signed main(){memset(head,-1,sizeof(head));scanf("%lld %lld %lld",&n,&m1,&m2);for(int i = 1;i <= m1;i ++){int u,v,w;scanf("%lld %lld %lld",&u,&v,&w);add(u,v,w);}for(int i = 1;i <= m2;i ++){int u,v,w;scanf("%lld %lld %lld",&u,&v,&w);add(v,u,-w);}for(int i = 1;i <= n;i ++) add(0,i,0);for(int i = 1;i < n;i ++) add(i + 1,i,0);int tmp = spfa(0);if(tmp <= -1)printf("%lld\n",tmp);elseprintf("%lld\n",spfa(1));return 0;
}

习题

P1993 小 K 的农场

P4926 [1007] 倍杀测量者 利用对数的性质转化成差分约束系统

P2474 [SCOI2008] 天平

P3530 [POI2012] FES-Festival Tarjan 结合差分约束

[ABC087D] People on a Line

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

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

相关文章

AI车牌监测识别摄像机

AI车牌监测识别摄像机是一种基于人工智能技术的高级监控设备,用于识别和记录车辆的车牌信息。该摄像机利用深度学习算法和图像识别技术,能够快速准确地捕捉车辆牌照信息,有助于提高交通安全管理和追踪犯罪嫌疑车辆。AI车牌监测识别摄像机是一种基于人工智能技术的高级监控设…

dedecms报错The each() function is deprecated

打开报错提示文件对应的行数 把 while (list($key) = each($val)) 改成foreach ($val as $key => $value)扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修…

dedecms文章简介标签infolen控制字数的方法

方法一:底层标签 [field:description/] 改成 [field:infos/] 方法二: [field:description function=cn_substr(@me,66)/]扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

后台管理登陆一直显示管理员密码错误?

有时浏览器缓存或Cookie可能导致登录问题。清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器登录,排除浏览器相关问题。 1. 验证密码修改成功 如果你最近修改了密码,确保修改操作确实成功。通过主机提供商控制面板或直接在数据库中检查管理员用户的密码哈希值是否已…

网站被黑,现在登录后台密码错误。

处理网站被黑且后台密码错误的问题,建议按照以下步骤进行:确保安全立即断开受感染服务器的网络连接以防止进一步攻击。 检查是否有其他入口点(如FTP、SSH)也被攻破。评估损害审查日志文件(访问日志、错误日志等),确定入侵时间和方法。 使用文件完整性检查工具对比原始安…

网站后台显示用户名或密码错误,无法登录

当网站后台显示用户名或密码错误且无法登录时,可以按照以下逻辑步骤进行排查和处理:验证输入信息确认输入的用户名和密码是否正确,注意大小写敏感。 尝试使用其他已知正确的管理员账户登录。检查浏览器缓存和Cookie清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器…

服务器重启后站点仍无法访问

服务器重启后,客户反馈网站仍然无法访问,应该如何处理? 答案:您好,建议您进行以下操作:检查网络连接: 断开并重新连接本地网络设备,确保网络畅通。 测试服务器端口: 测试80端口是否通畅,若仍无法访问,请提交工单至云服务器技术支持部门。非常感谢您的支持!由此给您…

域名状态为HOLD,如何解除?

问题:域名状态显示为HOLD,已经按要求上传资料并通过实名认证,但状态仍未更新。如何解除HOLD状态? 答案:您好,遇到域名状态为HOLD的情况,请联系域名管理机构或公安部电话专线(张警官),咨询申诉流程并说明情况。具体步骤如下:联系相关部门: 提供域名相关信息,申请解…

如何为域名及其二级域名添加HTTPS支持?

为域名及其二级域名添加HTTPS支持,可以按照以下步骤操作:购买SSL证书:选择合适的SSL证书类型(如单域名、通配符证书),并完成购买。 安装SSL证书:根据服务器类型(如Apache、Nginx),按照官方文档安装SSL证书。 配置强制HTTPS:在服务器配置文件(如.htaccess)中添加重…

当遇到无法删除FTP后台部分文件的问题时应采取哪些措施?

当您在尝试删除FTP后台中的某些文件时遇到了困难,这可能是由多种因素引起的。为了有效地解决问题,您可以按照以下步骤进行排查和处理:检查权限设置:首先要确认您是否拥有足够的权限来执行删除操作。有时候,文件夹或文件可能被设置了特定的访问权限,导致普通用户无法对其进…

为什么在切换PHP版本后插件仍然无法获取?

缓存问题:当您切换PHP版本时,服务器可能会保留之前的缓存文件,导致新版本的配置未能生效。建议您尝试清除服务器和浏览器的缓存,并重启Web服务器(如Apache或Nginx)以确保所有更改都已应用。配置文件未更新:某些情况下,即使您在控制面板中切换了PHP版本,实际的配置文件…

服务器不稳定,如何提高稳定性?

检查服务器资源使用情况:首先,建议您通过监控工具(如Zabbix、Prometheus等)实时查看服务器的CPU、内存、磁盘I/O等资源使用情况。如果发现某个资源接近满载,可能是导致不稳定的原因之一。可以通过优化代码、减少不必要的进程或增加硬件资源来缓解压力。优化应用程序性能:…