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

[差分约束]

时间:2024-07-17 17:34:44浏览次数:11  
标签:fmax 差分 约束 55 int fmin 式子

差分约束

定义

差分约束系统 是一种特殊的\(n\)元一次不等式组,它包含\(n\)个变量\(x_1,x_2,\dots,x_n\) 以及\(m\)个约束条件,每个约束条件是由两个其中的变量做差构成的,形如\(x_i-x_j≤C_k\)或者\(x_i-x_j≥C_k\)其中\(1≤i,j≤n,1≤k≤m\)

做法

假如有式子

\[\left\{\begin{matrix} x_1-x_2≤C_1 \\ x_2-x_3≤C_2 \\ x_1-x_3≤C_3 \end{matrix}\right.\]

我们发现由前两个式子相加可以得到\(x_1-x_3≤C_1+C_2\),和第三个式子对比发现,如果要满足这三个式子,那么\(x_1-x_3\)应该在\(C_1+C_2\)和\(C_3\)中取一个最小值,那么此时就会发现这个结构跟最短路的三角形不等式相似,如果将作差比作一条路径的话那么就是\(dis[1][2]+dis[2][3]\)跟\(dis[1][3]\)取\(min\),同理\(x_i-x_j≥C_k\)的时候应该取\(max\)

那么定义\(fmax[i][j]\)为\(x_i-x_j\)的最大值,\(fmin[i][j]\)为\(x_i-x_j\)的最小值,当\(x_i-x_j≤C_k\)可以给\(fmax[i][j]\)赋值为\(C_k\),当\(x_i-x_j≥C_k\)给\(fmin[i][j]\)赋值为\(C_k\),但是更新的时候要给\(fmax\)取\(min\),给\(fmin\)取\(max\),原理就是上面的式子

知道了原理之后,剩下的就是跑最短路/最长路了

例题洛谷P2474

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,A,B;
char s[55];
int fmin[55][55],fmax[55][55];
int main()
{
	memset(fmax,127,sizeof(fmax));
	scanf("%d%d%d",&n,&A,&B);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		int l = strlen(s+1);
		for(int j=1;j<=l;j++)
		{
			if(s[j] == '=' || i == j)
			{
				fmin[i][j] = fmax[i][j] = 0;
			}
			else if(s[j] == '+')
			{
				fmin[i][j] = 1;
				fmax[i][j] = 2;
			}
			else if(s[j] == '-')
			{
				fmin[i][j] = -2;
				fmax[i][j] = -1;
			}
			else if(s[j] == '?')
			{
				fmin[i][j] = -2;
				fmax[i][j] = 2;
			}
		}
		getchar();
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				fmin[i][j] = max(fmin[i][j],fmin[i][k]+fmin[k][j]);
				fmax[i][j] = min(fmax[i][j],fmax[i][k]+fmax[k][j]);
			}
	int c1 = 0,c2 = 0,c3 = 0;
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
		{
			if(A == i || A == j || B == i || B == j) continue;
			if(fmax[A][i] < fmin[j][B] || fmax[A][j] < fmin[i][B]) c3 ++;
			else if(fmax[A][i] == fmin[A][i] && fmax[j][B] == fmin[j][B] && fmax[A][i] == fmax[j][B]) c2 ++;
			else if(fmax[A][j] == fmin[A][j] && fmax[i][B] == fmin[i][B] && fmax[A][j] == fmax[i][B]) c2 ++;
			else if(fmin[A][i] > fmax[j][B] || fmin[A][j] > fmax[i][B]) c1 ++;
		}
	printf("%d %d %d",c1,c2,c3);
	return 0;
}

标签:fmax,差分,约束,55,int,fmin,式子
From: https://www.cnblogs.com/-Wind-/p/18307583

相关文章

  • 前缀和 & 差分
    前缀和一维前缀和一维前缀和主要用于计算任意区间的元素和。计算前缀和sum[i]=sum[i-1]+a[i];计算区间[l,r]的元素和s=sum[r]-sum[l-1];二维前缀和二维前缀和是一种用于快速计算二维数组中任意子矩阵元素之和。//计算矩阵的前缀和s[x][y]=s[x-1......
  • MySQL【表完整性约束】
    约束条件说明primarykey(PK)标识该字段为该表的主键,唯一性,不为空;UNIQUE+NOTNULLforeignkey(FK)标识该字段为该表的外键,实现表与表之间的关联null标识是否允许为空,默认为NULL。notnull标识该字段不能为空,可以修改。uniquekey(UK)标识该字段的值是唯一的......
  • 电工电子实验报告——差分放大器的测试方法
    差分放大器实验目的1.熟悉差动放大器电路的组成原理及用途;2.掌握差动放大器静态参数的测量方法;3.掌握差动放大器动态参数(差模放大倍数Aud,共模放大倍数Auc,共模抑制比KCMR)的测试方法:4.掌握带恒流源差动放大电路的调试方法。主要仪器设备及软件硬件:双踪示波器......
  • 改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论
     目录 1电力系统环境经济调度数学模型电力系统环境经济调度问题概述多目标差分进化算法的应用应用研究的意义2  改进的多目标差分进化算法3Python代码实现3.1结果3.2Python代码 4完整Python代码、数据下载   改进的多目标差分进化算法不仅可以应用......
  • Mysql数据库之约束条件
    一、主键约束主键约束(PRIMARYKEYconstraint)用于唯一标识数据库表中的每条记录。语法:createtable 表名(   列名1数据类型primary key,   列名2数据类型,   ...);在主键的后面添加:auto_increment,可以让主键自增。设置auto_increment之后,可以......
  • 改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论
     目录 1电力系统环境经济调度数学模型电力系统环境经济调度问题概述多目标差分进化算法的应用应用研究的意义2  改进的多目标差分进化算法3Python代码实现3.1结果3.2Python代码 4完整Python代码、数据下载   改进的多目标差分进化算法不仅可以应用......
  • MySQL的约束键&&多表查询
    约束概念概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据中数据的正确、有效性和完整性。外键约束概念​外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。注意:目前上述的两张表,在数据库层面,并为建立外键关联,所以无法......
  • [C++] C++20约束表达式和requires子句
    约束约束是逻辑操作和操作数的序列,它指定了对模板实参的要求。合取两个约束的合取是用&&运算符。template<typenameT>conceptluser=std::integral<T>&&std::signed_integral<T>;需要约束同时满足两个要求。合取判断的时候,使用短路检测,即对std::integra......
  • 观《深入理解C#》有感---泛型五种约束
    一、引用类型约束classSample<T>whereT:class类型实参可以是:任何类: Sample<string>接口: Sample<IDisposable>数组: Sample<int[]>委托: Sample<Action>二、值类型约束classSample<T>whereT:struct类型实参可以是:值类型: Sample<int>枚举: Sample&l......
  • 深度学习中的正则化技术 - 正则化和欠约束问题篇
    序言在机器学习与深度学习中,正则化是一项至关重要的技术,特别是在处理复杂数据和构建高效模型时。正则化的引入主要为了解决一类常见问题——欠约束问题。欠约束问题通常发生在数据分布具有某些特定性质或模型复杂度过高时,导致模型在训练过程中无法稳定收敛,甚至可能出现过拟......