您的位置:首页 > 其它

POJ 2983 Is the Information Reliable? (差分约束)

2012-08-09 10:12 579 查看
http://poj.org/problem?id=2983

题意:给出一些相对位置,问给出的数据是否正确;如样例一 P 1 2 1 表示1在2前面恰好一个单位,V 1 3 表示1在3前面至少一个单位

x1-x2=1 <=>x1-x2>=1 && x2-x1>=-1 (把等式变成两个不等式)

样例一列出的 不等式为
x1-x2>=1 (1)

x2-x1>=-1

x2-x3>=1 (2)

x3-x2>=-1

x1-x3>=1

x1-x3>=1

x3-x1>=-1 (3)

(1)(2)(3)左右各相加 得 0>=1 错误, 所以如果有负环说明数据有误

代码:(Bellman—Ford)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define nMAX 1002
#define mMAX 205005
#define inf -9999999
using namespace std;
int n;
int dis[nMAX],s_edge;
struct Edge
{
int u,v,w;
}edge[mMAX];
void addedge(int u,int v,int w)
{
s_edge++;
edge[s_edge].u=u;
edge[s_edge].v=v;
edge[s_edge].w=w;
}
bool Bellman_Ford()
{
int i,j,k;
for(i=1;i<=n;i++)
dis[i]=inf;
dis[0]=0;
bool fg;
for(k=1;k<=n+1;k++)
{
fg=1;
for(i=1;i<=s_edge;i++)
if(dis[edge[i].v]-dis[edge[i].u]<edge[i].w)
{
dis[edge[i].v]=dis[edge[i].u]+edge[i].w;
fg=0;
}
if(fg)break;
}
if(fg)return 1;
return 0;
}
int main()
{
int i,j,w,m;
char ch;
while(~scanf("%d%d",&n,&m))
{
s_edge=0;
while(m--)
{
getchar();
scanf("%c %d %d",&ch,&i,&j);
if(ch=='P')
{
scanf("%d",&w);
addedge(j,i,w);
addedge(i,j,-w);
}
else
{
addedge(j,i,1);
}
}

for(i=1;i<=n;i++)
addedge(0,i,0);

if(Bellman_Ford())
printf("Reliable\n");
else printf("Unreliable\n");
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: