Time Limit: 3000MS | Memory Limit: 131072K | |
Total Submissions: 12493 | Accepted: 3932 |
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 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.
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
题意: P A B X 表示 A 在距 B 北部 X 光年的地方
V A B 表示 A 在距 B 北部至少 1 光年的地方
问是否可以满足给出的所有条件,以此判断所给信息是否可靠。
分析: 由 P A B X <=> A - B == X <=> A - B <= X && A - B >= X ( B - A <= -X )
由 V A B <=> A - B >= 1 => B - A <= -1 建图
为保证所有点都访问到所以加入一个超级源点使其到每个点距离为0,
再跑一次最短路即可。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define N 100005 * 2 + 1000
int dis[N], vis[N], head[N], judge[N], k, n;
struct r
{
int u, v, w, next;
}e[N];
void add(int u, int v, int w)
{
e[k].v = v;
e[k].w = w;
e[k].next = head[u];
head[u] = k++;
}
bool spfa()
{
memset(vis, 0, sizeof(vis));
memset(judge, 0, sizeof(judge));
memset(dis, inf, sizeof(dis));
queue<int >q;
q.push(0);
vis[0] = 1;
judge[0] = 1;
dis[0] = 0;
while (!q.empty()){
int p = q.front(); q.pop();
vis[p] = 0;
for (int i = head[p]; i + 1; i = e[i].next){
if (dis[e[i].v] > dis[p] + e[i].w){//求最短路
dis[e[i].v] = dis[p] + e[i].w;
if (!vis[e[i].v]){
q.push(e[i].v);
vis[e[i].v] = 1;
if (++judge[e[i].v] > n)
return true;
}
}
}
}
return false;
}
int main()
{
#ifdef OFFLINE
freopen("t.txt", "r", stdin);
#endif
int i, j, a, b, x, m;
char type;
while (~scanf("%d%d", &n, &m))
{
memset(head, -1, sizeof(head));
k = 0;
while (m--){
scanf(" %c%d%d", &type, &a, &b);
if (type == 'P'){
scanf("%d", &x);
add(b, a, x);//a-b<=x
add(a, b, -x);//a-b>=x->b-a<=-x
}
else
add(a, b, -1);//a-b>=1->b-a<=-1
}
for(i=1;i<=n;i++) add(0, i, 0);//超级源点0
if (spfa())
puts("Unreliable");
else
puts("Reliable");
}
return 0;
}