Time Limit: 3000MS | Memory Limit: 131072K | |
Total Submissions: 11148 | Accepted: 3500 |
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=c,即a-b>=c&&b-a<=c;
当输入为V时,a与b的距离>=1;
求最长路,若存在最长路,则输出Unreliable
<span style="font-size:18px;">#include <iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> using namespace std; int inf=10000000; struct node { int u,v,w; } edge[200001]; int dis[200001]; int n,m,cnt; int bf() { int flag; int i,j; memset(dis,0,sizeof(dis)); for(i=1; i<=n; i++) { flag=0; for(j=0; j<cnt; j++) { if(dis[edge[j].u]<dis[edge[j].v]+edge[j].w) { dis[edge[j].u]=dis[edge[j].v]+edge[j].w; flag=1; } } if(flag==0) break; } if(flag) printf("Unreliable\n"); else printf("Reliable\n"); } int main() { int i,j,a,b,c,d,e; char ch; while(scanf("%d%d",&n,&m)!=EOF) { cnt=0; for(i=1; i<=m; i++) { getchar(); scanf("%c",&ch); if(ch=='P') { scanf("%d%d%d",&a,&b,&c); edge[cnt].u=a; edge[cnt].v=b; edge[cnt].w=c; cnt++; edge[cnt].u=b; edge[cnt].v=a; edge[cnt].w=-c; cnt++; } else { scanf("%d%d",&d,&e); edge[cnt].u=d; edge[cnt].v=e; edge[cnt].w=1; cnt++; } } bf(); } return 0; } </span>