题目链接
相关知识
http://blog.jobbole.com/96479/
题意
求一组不等式是否有解,这些不等式要么是 Xa+X(a+1)+.......+Xb<k 要么是 Xa+X(a+1)+.......+Xb>k
解析
差分约束的不等式小于等于常数,所以要处理为小于等于的情况,之后, 根据 ai<=aj+k 在建边 <j,i> <script id="MathJax-Element-4" type="math/tex"> </script>,还要考虑一个点到每一个点(除去自己)的值肯定大于等于0,再建边。之后,就是差分约束模板,跑最短路即可。
代码
#include<cstdio>
#include<cstring>
#include <iostream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
const int maxn = 100+10;
const int inf = 0x3f3f3f3f;
int inq[maxn];
int vis[maxn];
typedef pair<int, int> P;
vector<P>g[maxn];
int dis[maxn];
void init() {
memset(inq, 0, sizeof(inq));
memset(vis, 0, sizeof(vis));
}
void add(int u, int v, int w) {
g[u].push_back(make_pair(v, w));
}
int n, m;
bool SPFA(int st) {
queue<int>q;
memset(dis, inf, sizeof(dis));
vis[st] = 1;
dis[st] = 0;
q.push(st);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i=0; i<g[u].size(); i++) {
int v = g[u][i].first;
int w = g[u][i].second;
if (dis[v] > dis[u]+w) {
dis[v] = dis[u]+w;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
inq[v]++;
if (inq[v] > n+1)
return false;
}
}
}
}
return true;
}
int main() {
while (~scanf("%d%d", &n, &m)) {
if (n == 0)
break;
init();
for (int i=0; i<=n+1; i++)
g[i].clear();
for (int i=0; i<m; i++) {
int u, v, w;
char s[10];
scanf("%d%d%s%d", &u, &v, s, &w);
v = u+v;
if (strcmp(s, "gt") == 0) {
add(v, u-1, -1-w);
}
else {
add(u-1, v, w-1);
}
}
int st = n+1;
for (int i=0; i<n+1; i++)
add(st, i, 0); // a_i<=a_st
if (!SPFA(st))
puts("successful conspiracy");
else
puts("lamentable kingdom");
}
return 0;
}