Luogu P1993

前置知识:最短路径相关算法

如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统。

显然题目中给出的信息可以构成一个差分约束系统,虽然不等号的方向不统一,但是我们可以利用不等式的性质进行变换,将其全部统一成小于等于号(更换成小于等于号的原因是需要用到三角不等式)。

众所周知,最短路径算法中有一条三角不等式,即:

\[cost[x]<=cost[y]+val[y][x]
\]

通过移项就可以变化成:

\[cost[x]-cost[y]<=val[y][x]
\]

这与题目中给出的条件形式上是完全一致的。

那么我们就找到了解差分约束系统的方法:把形如\(a-b<=c\)的不等式视为在一个有向图中从\(b\)节点连一条权值为\(c\)的边到\(a\)节点,通过单源最短路径算法就可以求解。

那么如果图不连通怎么办?当然是选择加入一个超级点,向每一个节点连接一条权值为0的边。(其实好像也可以对每一个连通块其中的一个点跑一次SPFA)

//类BFS的SPFA会TLE,开O2可过
//建议使用类DFS的SPFA,然而我并不会(判负环时DFS-SPFA比较高效)
#include<cstdio>
#include<queue>
using namespace std;
struct data
{
int to,next,val;
}e[50005];
int cost[50005],flag,head[50005],n,m,a,b,c,cnt,cnt1[50005];
queue<int> que;
bool vis[50005];
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].val=w;
head[u]=cnt;
}
void First(int s)
{
for (int i=1;i<=n;i++) cost[i]=0x3f3f3f3f;
cost[s]=0;
}
bool SPFA(int s)
{
que.push(s);
vis[s]=true;
while (!que.empty())
{
int now=que.front();
que.pop();
vis[now]=false;
for (int i=head[now];i;i=e[i].next)
{
if (cost[e[i].to]>cost[now]+e[i].val)
{
cost[e[i].to]=cost[now]+e[i].val;
if (!vis[e[i].to])
{
que.push(e[i].to);
vis[e[i].to]=true;
}
cnt1[e[i].to]++;
if (cnt1[e[i].to]==n) return false;
}
}
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&flag,&a,&b);
if (flag!=3) scanf("%d",&c);
if (flag==1) add(a,b,-c);
if (flag==2) add(b,a,c);
if (flag==3)
{
add(a,b,0);
add(b,a,0);
}
}
for (int i=1;i<=n;i++)
add(n+1,i,0);
First(n+1);
SPFA(n+1);
if (SPFA(n+1)) printf("Yes");
else printf("No");
return 0;
}

【Luogu 1993】差分约束系统问题——小K的农场的更多相关文章

  1. 洛谷P1993 小K的农场 [差分约束系统]

    题目传送门 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...

  2. P1993 小K的农场 && 差分约束

    首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化 ...

  3. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

  4. BZOJ_3436_小K的农场_差分约束

    BZOJ_3436_小K的农场_差分约束 题意: 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述 ...

  5. 【BZOJ3436】小K的农场 差分约束

    [BZOJ3436]小K的农场 Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了, ...

  6. [bzoj3436]小K的农场_差分约束

    小K的农场 bzoj-3436 题目大意:给定n个点,每个节点有一个未知权值.现在有m个限制条件,形如:点i比点j至少大c,点i比点j至多大c或点i和点j相等.问是否可以通过给所有点赋值满足所有限制条 ...

  7. bzoj3436: 小K的农场(差分约束)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1575  Solved: 690[Submit][Status][Discus ...

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

    小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...

  9. BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2111  Solved: 986[Submit][Status][Discus ...

随机推荐

  1. codeforce -14A A. Letter

    A. Letter time limit per test 1 second memory limit per test 64 megabytes input standard input outpu ...

  2. 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息

    1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package  Microsoft.Extensions.Logging.L ...

  3. Java基础(二十一)集合(3)List集合

    一.List接口 List集合为列表类型,列表的主要特征是以线性方式存储对象. 1.实例化List集合 List接口的常用实现类有ArrayList和LinkedList,根据实际需要可以使用两种方式 ...

  4. node-批量上传文件

    很多项目可能都会涉及到的业务是关于多文件上传的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量和分包(一次请求传多个文件),这样每次都会以实现功能来完成,但是 ...

  5. Dockerfile 定制镜像

    从上一篇文章中我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置.文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观,如果我们可以把每一层修改.安装.构建.操作的 ...

  6. 基于SkyWalking的分布式跟踪系统 - 微服务监控

    上一篇文章我们搭建了基于SkyWalking分布式跟踪环境,今天聊聊使用SkyWalking监控我们的微服务(DUBBO) 服务案例 假设你有个订单微服务,包含以下组件 MySQL数据库分表分库(2台 ...

  7. Java编程思想——第17章 容器深入研究(two)

    六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...

  8. JAVA内存溢出与内存泄露

    虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...

  9. day 2上午 elect 选举 背包

    #include<iostream> using namespace std; int n; ; ]; long long p[maxn]; long long dp[maxn][maxn ...

  10. postman-接口间数据传递

    接口间数据传递 在我们做接口测试过程中会经常碰到使用上一个接口返回数据的情况,jmeter中可通过正则表达式提取,postman中如何提取呢?我们来看实例,这里使用的同一个接口来演示. ​ 我们提取出 ...