链接:http://poj.org/problem?id=2983
这个题确实不错啊。学会了一种新的处理方法。就是A-B=W时,要转换成两个不等式——A-B>=W&&A-B<=W,再进一步转换成差分约束的形式。
就是提交老是RE啊,搞不懂啊。改了很多觉得可能错误的细节,最后都不知道自己再改什么了。然后又莫名其妙AC了。然后再拿之前的代码提交都能AC了。
55555~可能我提交次数太多了,它可怜我了吧,怎么这么悲剧啊~~~
一直在水~~~~~~~~~~~~
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define MAXE 400005
#define MAXN 2010
using namespace std;
int dist[MAXN];
int cnt;
struct Edge
{
int u;
int to;
int w;
int next;
}edge[MAXE];
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].to=v;
edge[cnt++].w=w;
}
int BellmanFord(int n)
{
int i,j,tag;
for(i=1;i<=n;i++) //这里初始化我还不是很懂,貌似存在负权时最好都为0比较正确,也不要INF了
dist[i]=0;
for(j=1;j<=n;j++) //进行N次循环,包括了最后一次的负环判断
{
tag=0;
for(i=0;i<cnt;i++)
if(dist[edge[i].to]>dist[edge[i].u]+edge[i].w)
{
dist[edge[i].to]=dist[edge[i].u]+edge[i].w;
tag=1;
}
if(!tag)
break;
}
return tag;
}
int main()
{
int n,m;
int a,b,c,i;
char info[3];
while(scanf("%d%d",&n,&m)!=EOF)
{
cnt=0;
for(i=0;i<m;i++)
{
//getchar();
scanf("%s",info);
if(info[0]=='P')
{
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
add(a,b,-c);
}
else
{
scanf("%d%d",&a,&b);
add(a,b,-1);
}
}
if(BellmanFord(n))
printf("Unreliable\n");
else
printf("Reliable\n");
}
}