题意:给出两种关于防御站位置的信息,一种是确切的信息,P A B X,表示A在B北面X距离的地方,另一种是V A B,表示只知道A在B的北面,且距离至少为1。问这些信息有没有矛盾。
思路:明显的差分约束。对于P A B X,列出X<=A-B<=X,然后转化为两个不等式即可。
注意队列的大小~~
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1005
#define M 100005
#define INF 0x3fffffff
struct edge{
int y,w,next;
}e[(M<<1)+N];
int first[N],dis[N],q[1000000],used[N],num[N];
int n,m,top;
void add(int x,int y,int w){
e[top].y = y;
e[top].w = w;
e[top].next = first[x];
first[x] = top++;
}
int relax(int x,int y,int w){
if(dis[y] > dis[x]+w){
dis[y] = dis[x]+w;
return 1;
}
return 0;
}
int spfa(){
int i,now,front,rear,y;
front = rear = -1;
for(i = 1;i<=n;i++)
dis[i] = INF;
q[++rear] = 0;
memset(used, 0, sizeof(used));
memset(num, 0, sizeof(num));
used[0] = 1;
while(front < rear){
now = q[++front];
used[now] = 0;
for(i = first[now];i!=-1;i=e[i].next){
y = e[i].y;
if(relax(now,y,e[i].w) && !used[y]){
used[y] = 1;
q[++rear] = y;
num[y]++;
if(num[y] > n)
return 0;
}
}
}
return 1;
}
int main(){
while(scanf("%d %d",&n,&m) !=EOF){
int i,a,b,w;
char op;
top = 0;
memset(first, -1, sizeof(first));
getchar();
for(i = 1;i<=m;i++){
op = getchar();
if(op == 'P'){
scanf("%d %d %d\n",&a,&b,&w);
add(a,b,-w);
add(b,a,w);
}else{
scanf("%d %d\n",&a,&b);
add(a,b,-1);
}
}
for(i = 1;i<=n;i++)
add(0,i,0);
if(spfa())
printf("Reliable\n");
else
printf("Unreliable\n");
}
return 0;
}