Time Limit: 3000MS | Memory Limit: 131072K | |
Total Submissions: 11082 | Accepted: 3473 |
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表示准确的知道了两个点之间的距离,V表示只知道两个点之间的距离>=1,用bellman判断一下负环即可
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #include <stack> #include <iostream> #define MAX 300000 #define inf 99999999 using namespace std; int n,m; int cnt; int dis[MAX]; struct node { int u,v,w; }e[MAX]; void bellman() { int i,j; memset(dis,0,sizeof(dis)); int f=0; for(i=1;i<=n;i++) { f=0; for(j=0;j<cnt;j++) { if(dis[e[j].u] < dis[e[j].v] + e[j].w) { dis[e[j].u] = dis[e[j].v] + e[j].w; f=1; } } if(!f) //dis的值没有变化,直接跳出,节省时间 break; } if(f) printf("Unreliable\n"); else printf("Reliable\n"); } int main() { while(~scanf("%d%d",&n,&m)) { char s[10]; cnt=0; for(int i=1;i<=m;i++) { scanf("%s",s); if(s[0]=='P') { int u,v,w; scanf("%d%d%d",&u,&v,&w); e[cnt].u=u; //注意大于号的方向 e[cnt].v=v; e[cnt++].w=w; e[cnt].u=v; e[cnt].v=u; e[cnt++].w=-w; } else if(s[0]=='V') { int u,v; scanf("%d%d",&u,&v); e[cnt].u=u; e[cnt].v=v; e[cnt++].w=1; } } bellman(); } return 0; }