http://poj.org/problem?id=2983
题意:给定两种约束关系
Precise tip is in the form of P A B X
, means defense station A is X light-years north of defense station B.
Vague tip is in the form of V A B
, means defense station A is in the north of defense station B, at least 1 light-year, but the precise distance is unknown.
d[i]表示i与0的距离,在p关系可表示为x <=d[b] - d[a]<=x V关系可以表示为 d[b] - d[a] >= 1。 化简约束关系: P: d[b] - d[a] <= x d[a] - d[b] <= -c V: d[a] - d[b] <= -1
求最短路,判断是否存在bellman_ford。在做的时候,用了个memset初始化g结果一直tle,去掉后就ac了,看来以后尽量自己写训话出事化。
#include <cstdio> #include <cstring> #include <iostream> #define maxn 100007 using namespace std; struct node { int u,v,w; }g[maxn*100]; int len; int n,m,dis[1005]; const int inf = 99999999; void add(int u,int v,int w) { g[len].u = u; g[len].v = v; g[len].w = w; len++; } bool bellman_ford(int s) { int i,j; for (i = 1; i <= n; ++i) dis[i] = inf; dis[s] = 0; for (i = 1; i < n; ++i) { bool flag = false; for (j = 0; j < len; ++j) { int u = g[j].u,v = g[j].v,w = g[j].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; flag = true; } } if (!flag) return true; } for (j = 0; j < len; ++j) { int u = g[j].u,v = g[j].v,w = g[j].w; if (dis[v] > dis[u] + w) return false; } return true; } int main() { int i; int a,b,c; char op[3]; while (~scanf("%d%d",&n,&m)) { len = 0; for (i = 0; i < m; ++i) { scanf("%s%d%d",op,&a,&b); if (op[0] == 'P') { scanf("%d",&c); add(b,a,-c); add(a,b,c); } else { add(b,a,-1); } } if (bellman_ford(1)) printf("Reliable\n"); else printf("Unreliable\n"); } return 0; }