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是模糊,精确地就是==,即s[v]-s[u]=w(s[v]-s[u]>=w&&s[v]-s[u]<=w),当v的时候因为至少为1,所以s[v]-s[u]>=1,因为只是判断负环,所以我将其转化成>=
<pre name="code" class="cpp">#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define oo 1<<28
#include<queue>
struct node
{
int u;
int v;
int w;
int next;
} edge[1100000];
int n,m;
using namespace std;
int cnt;
int dis[5000];
int head[5000];
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt++].w=w;
}
void bellman_ford()
{
int flag;
memset(dis,-1,sizeof(dis));
for(int i=1;i<=n+1;i++)
{
flag=0;
for(int j=0;j<cnt;j++)
{
int v=edge[j].v;
int u=edge[j].u;
int w=edge[j].w;
if(dis[v]<dis[u]+w)
{
dis[v]=dis[u]+w;
flag=1;
}
}
if(!flag)//dis没有更新
break;
}
if(!flag) printf("Reliable\n");
else printf("Unreliable\n");
}
int main()
{
int i,j;
char str[1000];
while(~scanf("%d%d",&n,&m))
{
int u,v,w;
cnt=0;
memset(head,-1,sizeof(head));
for(i=1; i<=m; i++)
{
scanf("%s",&str);
if(str[0]=='P')
{
scanf("%d%d%d",&u,&v,&w);//精确查找双向边
add(u,v,w);
add(v,u,-w);
}
else if(str[0]=='V')
{
scanf("%d%d",&u,&v);//模糊查找
add(u,v,1);
}
}
bellman_ford();
}
return 0;
}