Is the Information Reliable?
Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years ago. Draco established a line of defense called Grot. Grot is a straight line with N defense stations. Because of the cooperation of the stations, Zibu’s Marine Glory cannot march any further but stay outside the line. A mystery Information Group X benefits form selling information to both sides of the war. Today you the administrator of Zibu’s Intelligence Department got a piece of information about Grot’s defense stations’ arrangement from Information Group X. Your task is to determine whether the information is reliable. The information consists of M tips. Each tip is either precise or vague. Precise tip is in the form of Vague tip is in the form of Input There are several test cases in the input. Each test case starts with two integers N (0 < N ≤ 1000) and M (1 ≤ M ≤ 100000).The next M line each describe a tip, either in precise form or vague form. Output Output one line for each test case in the input. Output “Reliable” if It is possible to arrange N defense stations satisfying all the M tips, otherwise output “Unreliable”. Sample Input 3 4 P 1 2 1 P 2 3 1 V 1 3 P 1 3 1 5 5 V 1 2 V 2 3 V 3 4 V 4 5 V 3 5 Sample Output Unreliable Reliable Source
POJ Monthly--2006.08.27, Dagger
|
[Submit] [Go Back] [Status] [Discuss]
这道题给出了两个约束条件, V是常规的, P是固定的差值, 对于固定的我们只要建两条边即可, 就比如 a-b >= x, a-b <= x, 相当于就把差值控的死死的, 就是固定值x, 这是一个小技巧. 这道题问你有没有解就是问你建出来的图有没有负环, 因为有负环就没有最短路(有最短路同时代表着方程组有解). 如果你列的方程式是跟我反过来的, 即两边都乘-1的话, 那就是求最长路, 判正环.
#include<stdio.h>
#include<queue>
#include<cstring>
#define clear(a) memset(a, 0, sizeof(a))
#define fufil(a) memset(a, 0x3f, sizeof(a))
using namespace std;
deque<int> q;
const int maxn = 1005;
bool vis[maxn];
char ss[2];
int dis[maxn], h[maxn], cnt[maxn], num, S, n, m;
struct edge{int nxt, v, w;}e[maxn * 200];
inline void add(int u, int v, int w){
e[++num].v = v, e[num].w = w, e[num].nxt = h[u], h[u] = num;
}
inline bool spfa(){
fufil(dis), clear(cnt);
q.push_front(S), dis[S] = 0, vis[S] = true;
while(!q.empty()){
int u = q.front();
q.pop_front(), vis[u] = false;
for(int i = h[u]; i; i = e[i].nxt){
int v = e[i].v;
if(dis[v] > dis[u] + e[i].w){
dis[v] = dis[u] + e[i].w;
if(!vis[v]){
if(++cnt[v] > n) return false;
if(q.empty() || dis[v] < dis[q.front()]) q.push_front(v);
else q.push_back(v);
vis[v] = true;
}
}
}
}
return true;
}
int main(){
while(scanf("%d%d", &n, &m) != EOF){
clear(h), num = 0;
for(int i = 1; i <= n; ++i) add(S, i, 0);
for(int i = 1; i <= m; ++i){
scanf("%s", ss);
int x, y, w;
if(ss[0] == 'P'){
scanf("%d%d%d", &x, &y, &w);
add(x, y, -w), add(y, x, w);
}
else{
scanf("%d%d", &x, &y);
add(x, y, -1);
}
}
if(spfa()) puts("Reliable");
else puts("Unreliable");
}
}