luogu1993 小K的农场
题目大意
小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的农场的更多相关文章
- Luogu1993 小K的农场 (差分约束)
\(if \ a - b <= c, AddEdge(b, a, c)\) Be careful, MLE is not good. #include <cstdio> #inclu ...
- 【BZOJ】3436: 小K的农场
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 938 Solved: 417[Submit][Status][Discuss ...
- 2014.7.7 模拟赛【小K的农场】
3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
- BZOJ_3436_小K的农场_差分约束
BZOJ_3436_小K的农场_差分约束 题意: 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述 ...
- P1993 小K的农场
P1993 小K的农场比较裸的差分约束,只是我判负环的时候sb了... 有负环意味着无解 #include<iostream> #include<cstdio> #includ ...
- 洛谷 P1993 小K的农场 解题报告
P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- P1993 小K的农场 && 差分约束
首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化 ...
- BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2111 Solved: 986[Submit][Status][Discus ...
随机推荐
- Laravel 5.4.36 session 发现
由于Laravel session机制完全脱离了PHP自带的session机制 因此对于php.ini 配置session对Laravel 是不会产生影响 代码路径: vendor/larav ...
- [ SCOI 2005 ] 最大子矩阵
\(\\\) \(Description\) 给出一个\(N\times M\)的有权矩阵,选出其中\(K\)个互不重叠的子矩阵,使得这\(K\)个子矩阵的权值和最大. \(N\in [1,100]\ ...
- JS——冒泡排序
核心思想: 1.外层for循环控制比较的轮数 2.内层for循环控制每轮比较的次数 3.外层每进行一轮比较,内层就少一次比较,因为外层每进行一轮比较都会产生一个最大值 <script> v ...
- JS——null
变量被赋值为null,目的往往是为了销毁这个对象: var n1 = 1; n1 = null;
- [Windows Server 2008] Ecshop安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:ECSHO ...
- 【译】x86程序员手册20-6.3.4门描述符守卫程序入口
6.3.4 Gate Descriptors Guard Procedure Entry Points 门描述符守卫程序入口 To provide protection for control tra ...
- 使用TFS創建團隊項目
使用微軟賬號登錄Team Service,關聯一個TS賬戶,用來存放你所有的項目,可以從瀏覽器中直接訪問,地址類似yourname.visualstudio.com. 詳細鏈接 在TS賬戶主面板中,可 ...
- js 判断 微信浏览器
<script type="text/javascript"> window.onload = function() { isWeixinBrowser(); } // ...
- zoom,zoom与haslayout的关系,zoom与transform: scale( )的区别
1.zoom:(缩放)
- tab切换案例
做个简单的tab切换效果,分别于jquery和js操作 (1)jQuery操作 先看下效果: <!DOCTYPE html> <html lang="en"> ...