(Luogu) P1993 小K的农场 (差分约束)

2024-03-20 17:18
文章标签 luogu 差分 约束 农场 p1993

本文主要是介绍(Luogu) P1993 小K的农场 (差分约束),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

解题思路:这是一道差分约束的裸题,我也是第一次接触差分约束,(详细解说戳我)简单来说,就是将不等式 与 spfa里的松弛操作联系起来,给予他意义,这样就可以用图的方式来解决他了,观察等式 a-b<=k ,这个式子可以变成 a<=b+k 这个式子是不很像

spfa里的松弛操作
if(d[v] < d[u] + w(u,v) ) {d[v] = d[u] + w(u, v);
}

我们可以将a看成d[v], b看成d[u], 那么k就是u到v这条边上的权值了,然后就可以建图。

而这个题目,他给的至多和至少就是这样的不等式(都化简成小于等于),而等于,那就建两条权值为0的边,然后可以还是不可以呢,那就判断有没有环,有环那就矛盾了。深搜判断环比宽搜快很多。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=1e4+5;
int n,m;
struct node {int to,w;
};
vector<node> eg[maxn];
int dist[maxn],vis[maxn];
bool spfa(int st) {vis[st]=1;int to,w;node tp;for(int i=0; i<(int)eg[st].size(); ++i) {tp=eg[st][i];to=tp.to,w=tp.w;if(dist[to]>dist[st]+w) {dist[to]=dist[st]+w;if(vis[to] || spfa(to))	return 1;}}vis[st]=0;return 0;
}
int main() {std::ios::sync_with_stdio(0);cin>>n>>m;int x,a,b,c;for(int i=1; i<=m; ++i) {cin>>x;if(x==1) {cin>>a>>b>>c;eg[a].push_back(node {b,-c});}if(x==2) {cin>>a>>b>>c;eg[b].push_back(node {a,c});}if(x==3) {cin>>a>>b;eg[a].push_back(node {b,0});eg[b].push_back(node {a,0});}}for(int i=1;i<=n;++i){if(spfa(i)){cout<<"No"<<endl;return 0;}} cout<<"Yes"<<endl;return 0;
}

 

这篇关于(Luogu) P1993 小K的农场 (差分约束)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830191

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

创建表时添加约束

查询表中的约束信息: SHOW KEYS FROM 表名; 示例: 创建depts表包含department_id该列为主键自动增长,department_name列不允许重复,location_id列不允许有空值。 create table depts(department_id int primary key auto_increment,department_name varcha

非空约束(Not Null)

修改表添加非空约束 使用DDL语句添加非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL; 示例: 向emp表中的salary添加非空约束。 alter table emp modify salary float(8,2) not NULL; 删除非空约束 使用DDL语句删除非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NULL;

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

FHQ Treap模版(luogu P3369)

FHQ Treap模版(自用),带注释 #include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,root,idx;struct node{int l,r;int val,key,size;}tr[N];int getnew(int v){tr[++idx].val=v;//权值tr[idx].key=rand(

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L

javaweb-day01-3(XML 的 dtd 约束)

XML 的约束方式有两种:dtd 和 schema  DTD约束: Document Type Definition    文档类型定义、文档类型界定。 入门示例: book.xml : <?xml version="1.0" encoding="gb2312"?><!DOCTYPE 书架 SYSTEM "book.dtd"><书架><书><书名>J