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

差分约束

时间:2024-07-26 21:40:28浏览次数:14  
标签:le int 差分 约束 vis edge dis

差分约束

差分约束 是一种特殊的 n 元一次不等式组,m 个约束条件,可以组成形如下的格式:

\[\begin{cases} x_1-x_1^{'} \le y_1 \\ x_2-x_2^{'} \le y_2 \\ \cdots \\ x_m-x_m^{'} \le y_m \end{cases} \]

我们的任务是需要求出一组解,\(x_1=a_1,x_2=a_2,\cdots,x_n=a_n\)

使得不等式组成立,否则为无解

注意到,每个式子都可以变形为\(x_i\le x_i^{'}+y_i\)

那么就不难想到,图论中的 三角不等式 ,即为松弛操作

回忆——

if(dis[edge[i].to]>dis[t]+edge[i].w)
   	dis[edge[i].to]=dis[t]+edge[i].w;

虽说它这里是 >,不过也没有关系,不用考虑

既然知道了,那我们就按照图论的方法来解:

dis[0]=0 ,并且向着每一个节点连接一条权值为0的边,运用单源最短路,判断 负权环 ,若有负权环则为无解,否则依次输出 dis[i]

提到负权环,就不得不提判断负权环的大佬算法——SPFA!!!

对于那些不废 SPFA 的同学们,可以翻到我之前的博客区康康~~

好啦,看模板题——

luoguP5960 [模板]差分约束

AC Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,cntedge;
const int MAXM=5e3+5,inf=65;
struct EDGE{
	int to,w,pre;
}edge[MAXM<<1];
int head[MAXM];
void add(int from,int to,int w)
{
	edge[++cntedge].to=to;
	edge[cntedge].w=w;
	edge[cntedge].pre=head[from];
	head[from]=cntedge;
	return;
}
bool vis[MAXM];
int u,v,w,t;
int dis[MAXM],cnt[MAXM];
queue<int> q;
bool spfa()
{
	q.push(0);
	cnt[0]++;
	vis[0]=true;
	while(!q.empty())
	{
		t=q.front();
		q.pop();
		vis[t]=false;
		for(int i=head[t];i;i=edge[i].pre)
		{
			if(dis[edge[i].to]>dis[t]+edge[i].w)
			{
				dis[edge[i].to]=dis[t]+edge[i].w;
				if(vis[edge[i].to]) continue;
				q.push(edge[i].to);
				vis[edge[i].to]=true;
				if(++cnt[edge[i].to]>=n+1)
					return false;
			}
		}
	}
	return true;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) add(0,i,0);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		add(v,u,w);
	}
	memset(dis,inf,sizeof(dis));
	dis[0]=0;
	if(!spfa())
		printf("NO\n");
	else
	{
		for(int i=1;i<=n;i++)
			printf("%d ",dis[i]);
		printf("\n");
	}	
	return 0;
}

AC记录

标签:le,int,差分,约束,vis,edge,dis
From: https://www.cnblogs.com/Atserckcn/p/18326312

相关文章

  • 表面贴装差分输出晶体振荡器 DSO533SK/DSO533SJ 全面解析
    表面贴装差分输出晶体振荡器DSO533SK/DSO533SJ全面解析摘要:本文深入探讨表面贴装差分输出晶体振荡器DSO533SK/DSO533SJ的特性、工作原理、优势、应用领域以及使用中的关键要点。通过详细的阐述和实例分析,为读者提供全面且深入的技术解读。一、引言在当今高度集成和高......
  • xml+dtd约束(很详细)
    xml+dtd约束(很详细)XML(可扩展性标记语言)概述XML的功能xml与html不同之处简单的xmlxml的基本语法元素属性CDATAphp解析xmlxml解析原理simplexml库使用php给xml添加节点使用php给xml添加节点DTD约束DTD语法内部的DOCYPE语法完整实例引入外部DTD约束实例XML(可扩......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......
  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 【模拟电子技术基础】差分放大电路——学生实验报告
        自己(大学生)在校做的实验报告,可借鉴使用,下载资源后可自行增删内容,或按照个人喜好优化排版。内容包括差分放大电路相关的实验目的、实验原理、实验过程及数据记录与处理分析、实验结论等。一、实验目的1.加深对差分放大电路性能及特点的理解2.学习差分放大电路主......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......
  • 洛谷题单指南-前缀和差分与离散化-P8218 【深进1.例1】求区间和
    原题链接:https://www.luogu.com.cn/problem/P8218题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。解题思路:先思考暴力做法:对于每一个区间[l,r],累加a[l]~a[r]所有元素,时间复杂度最坏为10^5*10^4,不可行。一维前缀和:设s[N]是a[N]的前缀和数组,即对于每一个s[i......
  • 是否可以从列中删除唯一约束?
    我尝试简单地删除unique=True约束并在命令行中运行flaskdbmigrateflaskdbupgrade,但是当我运行我的烧瓶应用程序时,我仍然收到(sqlite3.IntegrityError)UNIQUEconstraintfailed错误。有没有一种简单的方法可以做到这一点Flask-migrate还是我......
  • 描述带有约束的通用协议的类型
    给定以下python代码:fromtypingimportProtocol,TypeVarclassA:passclassB(A):passclassC(A):passT=TypeVar("T",B,C,contravariant=True)classX(Protocol[T]):deff(self,t:T)->None:...classX......
  • luoguT342340 差分 - 谁多谁闪亮
    差分-谁多谁闪亮题目背景外星人来地球游玩,他们到达某个贫困的小县城,这里有n*m个小村庄整齐排列着,外星人一看是个矩形排列,一下子来了兴趣,想在这里游玩,但无奈,已经天黑,没有一点灯光,他们只能使用法术,将某些村庄照亮。说来外星人也是很有礼貌的,他们也模仿着村庄的样子,每次给某些a......