您的位置:首页 > 其它

POJ 2983 Is the Information Reliable?

2013-03-20 20:47 447 查看
Is the Information Reliable?

Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 9433 Accepted: 2944
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

Source
POJ Monthly--2006.08.27, Dagger
     这是我做的第二道查分约束的题目,真是感觉自己太嫩了, a=z  我愣是没有想到可以转化为a>=z&&a<=z
很久不写spfa,本应该写> 而写成了>=  导致错了。   关键在于建图啊
#include <stdio.h>
#include <string.h>
#include <math.h>
struct num
{
int end,next,val;
}a[1000000];
int b[10010],sum[10010],d[10010],status[10010];
int queue[1000000];
int INF=0x7fffffff,n;
int main()
{
int spfa();
int i,j,m,s,t,x,y,val,k;
char c;
while(scanf("%d %d%*c",&n,&m)!=EOF)
{
memset(b,-1,sizeof(b));
for(i=1,j=0;i<=n;i++)
{
a[j].end=i;
a[j].val=0;
a[j].next=b[0];
b[0]=j; j++;
}
for(i=0;i<=m-1;i++)
{
scanf("%c %d %d",&c,&x,&y);
if(c=='P')
{
scanf("%d%*c",&val);
a[j].end=y;
a[j].val=-1*val;
a[j].next=b[x];
b[x]=j; j++;
a[j].end=x;
a[j].val=val;
a[j].next=b[y];
b[y]=j; j++;
}else
{
getchar();
a[j].end=y;
a[j].val=-1;
a[j].next=b[x];
b[x]=j; j++;
}
}
k=spfa();
if(k)
{
printf("Reliable\n");
}else
{
printf("Unreliable\n");
}
}
return 0;
}
int spfa()
{
int i,j,base,top,x,xend,k;
k=1;
memset(status,0,sizeof(status));
memset(sum,0,sizeof(sum));
for(i=1;i<=n;i++)
{
d[i]=INF;
}
base=top=0;
d[0]=0;
status[0]=1;
sum[0]=1;
queue[top++]=0;
while(base<top)
{
x=queue[base++];
status[x]=0;
for(j=b[x];j!=-1;j=a[j].next)
{
xend=a[j].end;
if(d[xend]>(d[x]+a[j].val))
{
d[xend]=d[x]+a[j].val;
if(!status[xend])
{
status[xend]=1;
queue[top++]=xend;
if(sum[xend]<=n-1)
{
sum[xend]+=1;
}else
{
k=0;
break;
}
}
}
}
if(j!=-1)
{
break;
}
}
return k;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: