关于差分约束
定义
差分约束系统
差分约束系统 是一种特殊的
差分约束系统中的每个约束条件
注意到,如果
以上摘自OIWIKI
翻译
简单来说,差分约束系统就是一种
而我们的任务即是求一组解(误解的话当然就是吴姐的啦)
而对于每一个约束条件(不等式)
都可以变形为
这与最短路的三角形不等式
不能说是一模一样,只能说是完全相同
于是我们就可以把所有约束条件的变形 看成是从
那么求不等式组的解 即为求这个图的最短路
于是我们得出
求差分约束的解<=>求图的最短路
例题
luogu P1993 小K的农场
思路
题意 | 转化 | 连边 |
---|---|---|
add(a,b,-c) | ||
add(b,a,c) | ||
add(b,a,0),add(a,b,0) |
利用spfa判断负环,如果不存在输出Yes,存在输出No
Elaina's code
Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N = 30100;
int n,m;
int dis[N],tot,head[N];
bool vis[N];
struct EDGE{
int nxt,w,to;
}e[N];
void add(int x, int y, int z)
{
e[++tot].to=y;
e[tot].nxt=head[x];
e[tot].w=z;
head[x]=tot;
}
void spfa(int x){
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int k=e[i].to;
if(dis[k]>dis[x]+e[i].w){
if(vis[k]){
cout<<"No";
exit(0);
}
dis[k]=dis[x]+e[i].w;
spfa(k);
}
}
vis[x]=0;
}
signed main(){
cin>>n>>m;
int s,x,y,z;
for(int i=1;i<=m;i++){
cin>>s;
if(s==1){
cin>>x>>y>>z;
add(x,y,-z);
}else if(s==2){
cin>>x>>y>>z;
add(y,x,z);
}else{
cin>>x>>y;
add(x,y,0);
add(y,x,0);
}
}
for(int i=1;i<=n;i++){
add(0,i,0);
}
mst(dis,INF);
dis[0]=0;
spfa(0);
cout<<"Yes";
return Elaina;
}
都看到这了,真的不点个赞吗(>ω<*)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本