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
题目大意:
给出M组信息,来判断这些信息是否Reliable。。
P A B X 表示 A--->B 的距离是X 于是便得到 1.dis[B] - dis[A] <= X && 2.dis[B] - dis[A] >= X 解这两个不等式便得到 dis[B] <= dis[A] - X;
于是便有 if (dis[B] > dis[A] - X) dis[B] = dis[A] - X;
V A B 表示 A --> B 之间的距离 >= 1;于是便得到 dis[A] - dis[B] >= 1; dis[B] > dis[ A] - 1;
if (dis[B] > dis[A] - 1) dis[B] = dis[A] - 1.。。。。
建立 <= 的差分约束系统,要求最短路,而要判断信息是否 Reliable,便要判环。利用的是Bellman_Ford。。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> using namespace std; int n,m,a,b,x; char c; struct node { int u; int v; int w; }E[9999999]; int dis[9999999],w[9999999]; void Bellman_Ford (int num) { int flag = 0; for (int i = 0; i < n;i++) { flag = 0; for (int j = 0; j < num; j++) { if ( dis[E[j].v] > dis[E[j].u] - E[j].w) { flag = 1; dis[E[j].v] = dis[E[j].u] - E[j].w; } } if (flag == 0) break; } if (flag == 1 ) printf ("Unreliable\n"); else printf ("Reliable\n"); } int main () { while (~scanf ("%d%d",&n,&m)) { int num = 0; for (int i = 0 ; i < m;i++) { scanf ("%*c %c",&c); if ( c == 'P') { scanf ("%d%d%d",&a,&b,&x); E[num].u = a,E[num].v = b; E[num++].w = x; E[num].u = b,E[num].v = a; E[num++].w = -x; } else if ( c == 'V') { scanf ("%d%d",&a,&b); E[num].u = a,E[num].v = b; E[num++].w = 1; } } Bellman_Ford (num); } return 0; }