题目大意

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

  • 农场a比农场b至少多种植了c个单位的作物,
  • 农场a比农场b至多多种植了c个单位的作物,
  • 农场a与农场b种植的作物数一样多。

但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

差分约束

要处理一组类似$x_{i1}+k_i\geq x_{i2}$的形式的偏序关系,我们发现图上每条边e连接的两个结点的单源最短路径长度都满足u[e]+w[e]>=v[e](u可能在v的最短路径上,也可能不在)。所以我们将图上的结点$x_{i1}, x_{i2}$连一条长度为$k_i$的边,将原点与所有边相连,跑一下最短路,那么每个结点的dist就是其所对应$x$值的一个解。

无解当且仅当图中有负环,判断负环的方法可以为:在SPFA时,判断每个结点的最短路径所经过的结点的数量是否超过TotNode,超过了则说明有负环。

题解说明

使用STL里的queue维护Node*,在BZOJ上可以AC,在洛谷上由于评测机64位指针8子节导致RE;queue改为维护int原先RE变为TLE,开O2后AC,不开O2即使手写queue也没有卵用。据说有用Dfs实现的SPFA,但是我不会。

// luogu-judger-enable-o2
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; const int MAX_NODE = 10010, MAX_EDGE = MAX_NODE * 3, INF = 0x3f3f3f3f; struct Node;
struct Edge; struct Node
{
Edge *Head;
int Dist, FromEdgeCnt;
bool Inq;
}_nodes[MAX_NODE];
int _vCount; struct Edge
{
Node *To;
Edge *Next;
int Weight;
}_edges[MAX_EDGE];
int _eCount; void AddEdge(int uId, int vId, int w)
{
Node *u = _nodes + uId, *v = _nodes + vId;
Edge *e = _edges + ++_eCount;
e->Weight = w;
e->To = v;
e->Next = u->Head;
u->Head = e;
} bool SPFA(Node *start)
{
for (int i = 1; i <= _vCount; i++)
_nodes[i].Dist = INF;
start->Dist = 0;
start->FromEdgeCnt = 0;
start->Inq = true;
static queue<int> q;
q.push(start - _nodes);
while (!q.empty())
{
int curId = q.front();
q.pop();
Node *cur = _nodes + curId;
cur->Inq = false;
if (cur->FromEdgeCnt > _vCount)
return false;
for (Edge *e = cur->Head; e; e = e->Next)
{
if (cur->Dist + e->Weight < e->To->Dist)
{
e->To->Dist = cur->Dist + e->Weight;
e->To->FromEdgeCnt = cur->FromEdgeCnt + 1;
if (!e->To->Inq)
{
e->To->Inq = true;
q.push(e->To - _nodes);
}
}
}
}
return true;
} int main()
{
int qCnt;
_eCount = 0;
scanf("%d%d", &_vCount, &qCnt);
_vCount++;
for (int i = 1; i <= qCnt; i++)
{
int op, a, b, c;
scanf("%d", &op);
switch (op)
{
case 1:
scanf("%d%d%d", &a, &b, &c);
AddEdge(a, b, -c);
break;
case 2:
scanf("%d%d%d", &a, &b, &c);
AddEdge(b, a, c);
break;
case 3:
scanf("%d%d", &a, &b);
AddEdge(a, b, 0);
AddEdge(b, a, 0);
break;
}
}
for (int i = 1; i <= _vCount - 1; i++)
AddEdge(_vCount, i, 0);
if (SPFA(_nodes + _vCount))
printf("Yes\n");
else
printf("No\n");
return 0;
}

  

luogu1993 小K的农场的更多相关文章

  1. Luogu1993 小K的农场 (差分约束)

    \(if \ a - b <= c, AddEdge(b, a, c)\) Be careful, MLE is not good. #include <cstdio> #inclu ...

  2. 【BZOJ】3436: 小K的农场

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 938  Solved: 417[Submit][Status][Discuss ...

  3. 2014.7.7 模拟赛【小K的农场】

    3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...

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

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

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

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

  6. P1993 小K的农场

    P1993 小K的农场比较裸的差分约束,只是我判负环的时候sb了... 有负环意味着无解 #include<iostream> #include<cstdio> #includ ...

  7. 洛谷 P1993 小K的农场 解题报告

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

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

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

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

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

随机推荐

  1. phpstorm如何在同一个文件夹打开多个目录

    phpstorm默认一个窗口只显示一个项目,如果新建一个项目,他会给你个选项卡,问你是在新窗口打开新项目还是在本窗口打开. 能不能在一个窗口打开多个项目呢?就像sublime text那样,其实是可以 ...

  2. cmd 切换目录和配置环境变量

    记录一下: 在用cmd进行切换盘符的时候, 如果是从 C盘切换到其他盘的话: D:直接回车就行了. 如果是在同一个盘符内切换文件夹的话,cd D:\ComputerSoft\curl\curl-7.6 ...

  3. webpack 打包后 Uncaught SyntaxError: Unexpected token <

    问题描述:npm run dev 没报错.是可以正常运行的, npm run build 过程也没报错, 但是打开dist   index.html  就报错了  错误内容:       解决方法: ...

  4. sql server 数据分析优化实战(一)——SQL语句优化

    前言 在我们进行数据分析的时候,首要的目标是根据业务逻辑,通过编写SQL代码得到我们想要的结果,这是毋庸置疑的.一般情况下,由于我们分析的数据量比较少,体会不出SQL语句各种写法的性能优劣,对SQL代 ...

  5. HDU_1113_字符串处理

    Word Amalgamation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. HTML5易漏知识点锦集

    本文通过对w3schoolHTML5基础教程,整理出比较常见的却又容易遗忘或者忽略的HTML5相关知识点.本文的标题顺序与w3school中的HTML5基础教程标题顺序保持一致.适合翻阅和复习. 1. ...

  7. tomcat8安装及配置

    首先是解压版的安装.很简单,直接解压到要安装的位置就OK了. 2.启动 bin目录下,执行startup.bat文件 3.浏览器中打开地址http://localhost:8080/

  8. Mac 执行 gulp 报错 -bash: gulp: command not found

    在mac系统下安装gulp,之后执行gulp 报如下错误: -bash: gulp: command not found 回溯安装过程发现问题如下 1.执行 npm root: Application ...

  9. auto类型推导

    引言 auto : 类型推导. 在使用c++的时候会经常使用, 就像在考虑STL时迭代器类型, 写模板的时候使用auto能少写代码, 也能帮助我们避免一些隐患的细节. auto初始化 使用auto型别 ...

  10. Vova and Train (codeforces 1066A)

    数学题.用右边界以内的区间内的灯减去左边界以内区间内的灯,并且如果左边界正好有灯再减去一即可 我的代码 #include <bits/stdc++.h> using namespace s ...