关于差分约束

定义

差分约束系统

差分约束系统 是一种特殊的 n 元一次不等式组,它包含 n 个变量 x1,x2,,xn 以及 m 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 xixjck,其中 1i,jn,ij,1km 并且 ck 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 x1=a1,x2=a2,,xn=an,使得所有的约束条件得到满足,否则判断出无解。

差分约束系统中的每个约束条件 xixjck 都可以变形成 xixj+ck,这与单源最短路中的三角形不等式 dist[y]dist[x]+z 非常相似。因此,我们可以把每个变量 xi 看做图中的一个结点,对于每个约束条件 xixjck,从结点 j 向结点 i 连一条长度为 ck 的有向边。

注意到,如果 {a1,a2,,an} 是该差分约束系统的一组解,那么对于任意的常数 d{a1+d,a2+d,,an+d} 显然也是该差分约束系统的一组解,因为这样做差后 d 刚好被消掉。

以上摘自OIWIKI

翻译

简单来说,差分约束系统就是一种N元一次不等式组,它包含N个变量X1XN以及M个约束条件,它的基本结构形如
                        XiXjCk(其中Ck为常数)

而我们的任务即是求一组解(误解的话当然就是吴姐的啦

而对于每一个约束条件(不等式) 
                        XiXjCk

都可以变形为      
                        XiXj+Ck

这与最短路的三角形不等式

                        dis[y]dis[x]+z

不能说是一模一样,只能说是完全相同
于是我们就可以把所有约束条件的变形 看成是从j出发向i连一条边权为Ck的有向边
那么求不等式组的解 即为求这个图的最短路
于是我们得出
求差分约束的解<=>求图的最短路

例题

luogu P1993 小K的农场

思路

题意 转化 连边
xaxbc xbxac add(a,b,-c)
xaxbc xaxbc add(b,a,c)
xa=xb xaxb0,xbxa0 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;
}

都看到这了,真的不点个赞吗(>ω<*)

posted @   Elaina_0  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示