首页 > 其他分享 >差分约束

差分约束

时间:2024-09-26 09:23:24浏览次数:7  
标签:dist int 差分 st leq 约束

差分约束系统

参考博客:

oiwiki
博客园

差分约束系统

定义

差分约束系统是一种特殊的 \(n\) 元一次不等式组,它包含 \(n\) 个变量 \(x_1, x_2, \dots, x_n\) 以及 \(m\) 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 \(x_i - x_j \leq c_k\),其中 \(1 \leq i, j \leq n, i \neq j, 1 \leq k \leq m\) 并且 \(c_k\) 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 \(x_1 = a_1, x_2 = a_2, \dots, x_n = a_n\),使得所有的约束条件得到满足,否则判断出无解。

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

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

过程

设 \(dist[0] = 0\) 并向每一个点连一条权重为 \(0\) 的边,跑单源最短路,若图中存在负环,则给定的差分约束系统无解,否则,\(x_i = dist[i]\) 为该差分约束系统的一组解。

性质

一般使用 Bellman–Ford 或队列优化的 Bellman–Ford(俗称 SPFA,在某些随机图跑得很快)判断图中是否存在负环,最坏时间复杂度为 \(O(nm)\)。

求所有变量和的最值

如果要求所有变量和的最值,例如令所有变量都为非负整数,求最小的变量和,我们可以通过跑最长路来实现。对于一个 \(x_i \geq x_j+c_k\)的式子,变为图上一条从 \(i\)连向 \(j\)的边,权值为 \(c_k\)

if(dist[u]<dist[v]+w)
    dist[u]=dist[v]+w;

题目:

【模板】差分约束
小 K 的农场
[SCOI2011] 糖果

模版:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010;
int dist[N];
int n,m;
bool st[N];
vector<array<int,2>> E[N];
bool spfa()
{
	memset(st,false,sizeof st);
	memset(dist,0x3f,sizeof dist);
	dist[0]=0;
	queue<int> q;
	q.push(0);
	st[0]=true;
	int cnt=0;
	while(q.size())
	{
		auto ver=q.front();
		q.pop();
		cnt++;
		if(cnt>=1e7) return false;
		st[ver]=false;
		for(auto [v,w] : E[ver])
		{
			if(dist[v]>dist[ver]+w)
			{
				dist[v]=dist[ver]+w;
				if(!st[v])
				{
					st[v]=true;
				    q.push(v);
				}
				
			}
		}
	}
	return true;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		E[0].push_back({i,0});
	}
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		E[u].push_back({v,w});
	}
	if(!spfa()) cout<<"NO"<<endl;
	else
	{
		for(int i=1;i<=n;i++)
			cout<<-dist[i]<<" \n"[i==n];
	}
	return 0;
}

标签:dist,int,差分,st,leq,约束
From: https://www.cnblogs.com/Violetfan/p/18432772

相关文章

  • MYSQL-约束
    1-limit语句limit的作用是限制查询记录的条数格式如下select*from表名limitoffset,row_count;举例select*fromtablelimit 1,4;这里的1指的是从第二行数据开始,1就是索引(索引从0开始),4指的是查询记录条数,也就是从第二条(行)开始,一共查询四条记录,到第五条(行)如......
  • 达梦空格填充导致违反唯一约束问题排查及处理
    在oracle迁移到达梦过程中,创建主键提示违法唯一约束。如下所示:用户反馈没有重复数据原因是达梦空格填充模式参数(BLANK_PAD_MODE)为0 , 查询语句将忽略字符串的后缀空格,由于大部分其他都已经迁移过去,只有个别表报错,不能重新初始化实例,需要将有问题的数据查找出来删除查找重......
  • 远程升级频频失败?你可能忽略了模组差分包…
    去年开发的一个项目产品,用的是合宙4G-Cat.1低功耗模块Air780E。最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试,发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况,而今年4月份采购的模块批次就不会掉线,很奇怪。我联系了对应负责的销售,了......
  • 亚诺德经典低失真差分ADC驱动器芯片——AD8138
    博主首拆华为三折叠MateXT:内部设计完胜iPhone16,零部件多是国产光刻机的“前世今生”推荐文章:本期是平台君和您分享的第78期内容NEWS新闻早知道今年的巴黎奥运会结束了,不仅是中国人,连无数外国人都情不自禁怀念起16年前的北京奥运会开幕式。在2008年,智能手机还没......
  • 制管行业:APS排程应对钢卷分条与模具约束挑战
    五金制造行业是工业领域的重要组成部分,小到螺丝、螺母大到复杂机械制造,五金制造产品应用范围每年广泛,为机械制造、汽车制造、电子工业、建筑等众多行业提供基础零部件。随着市场个性化需求和交期要求的提高,越来越多的五金制造企业开始难以应对市场带来的挑战,不少企业开始向市场寻求......
  • 一维差分和等差数列差分
    一维差分不支持边操作边查询对于数组a,定义其差分数组(differencearray)为i=0时,d[i]=a[0];i>0时,d[i]=a[i]-a[i-1];性质1:从左到右累加d中的元素,可以得到数组a。性质2:如下两个操作是等价的。区间操作:把a的子数组a[i,j]都加上x。单点操作:把d[i......
  • 非线性规划——无约束最优化问题精讲
    最优化问题的研究历史可以追溯到17世纪的变分法,随着数学、物理学、经济学和计算科学的不断发展,最优化问题逐渐成为一个独立的学科。对于无约束最优化问题的求解,从最早的最速下降法,到后来的牛顿法和共轭梯度法,再到现代的变尺度法和智能算法,发展历程反映了科学技术进步的轨迹。无约......
  • xcode 约束报错
    报错信息如下MakeasymbolicbreakpointatUIViewAlertForUnsatisfiableConstraintstocatchthisinthedebugger.ThemethodsintheUIConstraintBasedLayoutDebuggingcategoryonUIViewlistedin<UIKitCore/UIView.h>mayalsobehelpful.2024-09-2408:56:2......
  • 树上差分+lca 黑暗的锁链
    //**太久不写了,感觉很难受。。。比赛最近打得也不好,课内任务又重,还要忙着做项目。何去何从。今天又写了一题,用了树上差分的知识。下面来整理整理。1.首先让我们学一下lca(最小公共父节点) 我用的是倍增来求的。总共其实就是两步:dfs打ST表预处理每个点的上面节点 lca求两......
  • 数模方法论-无约束问题求解
    一、基本概念        无约束问题在数学建模中是指优化过程中没有任何限制条件的情况。这种问题旨在寻找一个决策变量集合,使得某个目标函数(如成本、效益或其他需要优化的量)达到最大或最小值。具体来说,无约束问题通常可以表示为:其中是目标函数,是决策变量。在这种情况......