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 X可以转化为A-B<=X或B-A>=X
V A B,则可以转化为A-B<=-1
对于《=的差分约束题,就要用到最短路,而判断信息的可靠与否就要判断图中是否存在负权回路即环。
代码:
#include<iostream>
#include<string.h>
#define N 1005
#define M 200005
#define MAX 99999999
using namespace std;
struct edge{int s,e,w;
}aa[M];
int dist[N];
int n,m,tot;
bool Bellman_ford()
{ bool flag;本来是进行n-1次松弛的,在这里我用了一些小技巧松弛了n次。
for(int i=1;i<=n;++i)
{ flag=true;
for(int j=1;j<=tot;++j)
{ int temp=dist[aa[j].s]+aa[j].w;
if(dist[aa[j].e]>temp)
{ dist[aa[j].e]=temp;
flag=false;
}
}
if(flag) return true;如果在某一次dist中的值不改变的时候,则以后不会在改变,直接还回true即可。
}
return flag;而在进行第N次松弛时如果还可以松弛则说明图中存在回路,而此时flag为false。否者falg为true因此可以直接返回flag即可。
}
int main()
{ char ch;
while(cin>>n>>m)
{ tot=0;
memset(dist,0,sizeof(dist));
for(int i=0;i<m;++i)
{ getchar();
cin>>ch;
int a,b,c;
cin>>a>>b;
if(ch=='P')
{ cin>>c;
aa[++tot].s=a;
aa[tot].e=b;
aa[tot].w=-c;
aa[++tot].s=b;
aa[tot].e=a;
aa[tot].w=c;
}
else{ aa[++tot].s=a;
aa[tot].e=b;
aa[tot].w=-1;
}
}
if(Bellman_ford()) cout<<"Reliable"<<endl;
else cout<<"Unreliable"<<endl;
} return 0;
}