POJ_2983_Is the Information Reliable? _差分约束

来源:互联网 发布:跳舞毯安装软件 编辑:程序博客网 时间:2024/06/09 22:27
Is the Information Reliable?
Time Limit: 3000MS        Memory Limit: 131072K
Total Submissions: 12466        Accepted: 3924

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 u v w 表示 v在u以北w公里。

V u v 表示 v在u北边,最少1公里,问所有条件可不可以全部满足。


思路:

由P 可以得到 v - u = w 也就是u - v <= w  &&  v - u <= -w ,
由 V u v 得到 v - u >= 1 也就是 u - v <= -1 ;

建图,使用最短路,判断是否会有负环。


#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#define inf 0x3f3f3f3fusing namespace std;struct Node{int v;int w;int next;}s[210000];int head[1010];int dist[1010];bool vis[1010];int n,m,num;int coun[1010];void add_edge(int a,int b,int c){s[num].v = b;s[num].w = c;s[num].next = head[a];head[a] = num++;}int SPFA(){queue<int> Q;memset(dist,inf,sizeof(dist));memset(vis,false,sizeof(vis));memset(coun,0,sizeof(coun));dist[0] = 0;vis[0] = true;coun[0] = 1; Q.push(0);while(!Q.empty()){int u = Q.front();Q.pop();vis[u] = false;coun[u]++;if(coun[u]>n){return 0;}for(int i=head[u];i!=-1;i=s[i].next){int v = s[i].v;int w = s[i].w;if(dist[v]>dist[u]+w){dist[v] = dist[u] + w;if(!vis[v]){vis[v] = true;Q.push(v);}}}}return 1;}int main(){while(scanf("%d%d",&n,&m)!=EOF){num = 0;int i,j;char c[2];int u,v,w;memset(head,-1,sizeof(head));while(m--){scanf("%s",c);if(c[0]=='P'){scanf("%d%d%d",&u,&v,&w);add_edge(v,u,w);add_edge(u,v,-w);}else{scanf("%d%d",&u,&v);add_edge(u,v,-1);}}for(i=1;i<=n;i++){add_edge(0,i,0); //找一个超级源点,给所有点都有关系,权值为0 }if(SPFA()){printf("Reliable\n");}else{printf("Unreliable\n");}}return 0;}



0 0