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;
}