石家庄做网站排名公司/企业宣传册
题目地址:
https://www.luogu.com.cn/problem/P1993
题目描述:
小K在MC里面建立很多很多的农场,总共nnn个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共mmm个),以下列三种形式描述:
农场aaa比农场bbb至少多种植了ccc个单位的作物;
农场aaa比农场bbb至多多种植了ccc个单位的作物;
农场aaa与农场bbb种植的作物数一样多。
但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。
输入格式:
第一行包括两个整数nnn和mmm,分别表示农场数目和小K记忆中的信息数目。
接下来mmm行:
如果每行的第一个数是111,接下来有三个整数a,b,ca,b,ca,b,c,表示农场aaa比农场bbb至少多种植了ccc个单位的作物;
如果每行的第一个数是222,接下来有三个整数a,b,ca,b,ca,b,c,表示农场aaa比农场bbb至多多种植了ccc个单位的作物;
如果每行的第一个数是333,接下来有两个整数a,ba,ba,b,表示农场aaa种植的的数量和bbb一样多。
输出格式:
如果存在某种情况与小 K 的记忆吻合,输出 Yes
,否则输出 No
。
数据范围:
对于100%100\%100%的数据,保证1≤n,m,a,b,c≤5×1031 \le n,m,a,b,c \le 5 \times 10^31≤n,m,a,b,c≤5×103。
差分约束问题,可以用最短路或者最长路来解决。考虑有n+1n+1n+1个点的最短路问题,点的编号为0,1,...,n0,1,...,n0,1,...,n,000是超级源点,以其为源点考虑最短路问题。对于111类型的不等式,即有a−b≥ca-b\ge ca−b≥c,等价于b≤a+(−c)b\le a+(-c)b≤a+(−c),可以从点aaa到点bbb连一条长度为−c-c−c的有向边;对于222类型的不等式,即有a−b≤ca-b\le ca−b≤c,等价于a≤b+ca\le b+ca≤b+c,可以从bbb到aaa连一条长度为ccc的有向边;对于333类型的不等式,即有a=ba=ba=b,可以将aaa和bbb之间互相连一条长度为000的有向边。最后从超级源点000向其余每个点连一条长度为000的有向边,最后解以000为源点的最短路问题即可。如果存在负环,则不存在最短路,说明无解,否则说明有解。判断负环的问题可以用SPFA,并且将队列改为栈更适合判断负环。代码如下:
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;const int N = 5e3 + 10, M = N << 1;
int n, m;
int h[N], e[M], ne[M], w[M], idx;
int dist[N], cnt[N];
bool vis[N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}bool spfa() {stack<int> stk;for (int i = 1; i <= n; i++) {stk.push(i);vis[i] = true;}while (stk.size()) {int t = stk.top(); stk.pop();vis[t] = false;for (int i = h[t]; ~i; i = ne[i]) {int v = e[i];if (dist[v] > dist[t] + w[i]) {dist[v] = dist[t] + w[i];cnt[v] = cnt[t] + 1;if (cnt[v] > n - 1) return false;if (!vis[v]) {stk.push(v);vis[v] = true;}}}}return true;
}int main() {memset(h, -1, sizeof h);scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++) {int type, a, b, c;scanf("%d", &type);if (type == 3) {scanf("%d%d", &a, &b);add(a, b, 0), add(b, a, 0);} else {scanf("%d%d%d", &a, &b, &c);if (type == 1) add(a, b, -c);else add(b, a, c);}}if (spfa()) puts("Yes");else puts("No");
}
时间复杂度O(nm)O(nm)O(nm),空间O(n)O(n)O(n)。