Is the Information Reliable?

Time Limit: 3000MS

 

Memory Limit: 131072K

Total Submissions: 15714

 

Accepted: 4868

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

Source

​POJ Monthly--2006.08.27​​, Dagger

题意:

从情报组织获得了一些准确情报p,和模糊情报v,p给出了两个点a,b之间的准确距离c,v只给出a到b的距离至少为1,并且所有点在一条直线上。求这些情报是否可靠。

分析:

不等式建立边的条件,差分约束系统

 P: a-b=x 推出a-b<=x,a-b>=x(b-a<=-x)

V ;  a-b>=1  b-a<=-1

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N = 1000000 + 5;
int head[N],tot,cnt[N],dis[N],list[N];
bool vis[N];
int n,m;
struct node{
int next,to,v;
}e[N];
void adde( int a, int b, int c ){
e[++tot].next = head[a];
head[a] = tot;
e[tot].to = b;
e[tot].v = c;
}
bool spfa(int be){

memset(vis,false,sizeof(vis));
for( int i = 0; i <= n; i++ )
dis[i] = -1e9;
memset(cnt,0,sizeof(cnt));

queue<int>q;
q.push(be);
cnt[be]++;
vis[be] = true;
dis[be] = 0;
while( !q.empty() ){
int u = q.front();
q.pop();
vis[u] = false;
for( int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if( dis[v] < dis[u] + e[i].v ) {
dis[v] = dis[u] + e[i].v;
if( !vis[v] ) {
vis[v] = true;
if( ++cnt[v]>n ) return false;
q.push(v);
}
}
}
}
return true;
}
int main(){
int a ,b ,c;
char str[10];
while(~scanf("%d %d" ,&n ,&m)){
memset(head ,0 ,sizeof(head));
tot = 1;
for( int i = 1 ;i <= m ; i++ ){
scanf("%s" ,str);
if(str[0] == 'P'){
scanf("%d %d %d" ,&a ,&b ,&c);
adde(a ,b ,c);
adde(b ,a ,-c);
}
else{
scanf("%d %d" ,&a ,&b);
adde(a ,b ,1);
}
}
for( int i = 1 ; i <= n ; i++ )
adde(0 ,i ,0);
if(spfa(0)) printf("Reliable\n");
else printf("Unreliable\n");
}
return 0;
}