题目链接:poj 2983
给定一些点的先后顺序,问是否存在一种情况保证所有条件都满足
a明确早于b w时 dis[a]-dis[b]<=-w dis[b]-dis[a]<=w
只知道a早于b时 dis[a]-dis[b]<=-1
然后用bellmanford算法判断是否存在负环即可
/******************************************************
* File Name: 2983.cpp
* Author: kojimai
* Creater Time:2014年08月20日 星期三 13时58分49秒
******************************************************/
/*
*差分约束系统,给定互相之间的前后关系,问是否有矛盾
*a明确早于b w
** dis[a]-dis[b]<=-w dis[b]-dis[a]<=w
*a早于b
**dis[a]-dis[b]<=-1
*将所有的的约束条件转化为<= 转化成求图的最短路即可
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 1005
#define FF 100005
#define INF 233333333
int dis[FFF];
int vi[FF*2],cost[FF*2],from[FF*2];
int n,m,e;
bool bellman()
{
for(int i=2;i<=n;i++)
dis[i]=INF;
dis[1]=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<e;j++)
{
if(dis[vi[j]]>dis[from[j]]+cost[j])
dis[vi[j]]=dis[from[j]]+cost[j];
}
}
bool flag=true;
for(int i=0;i<e;i++)
{
if(dis[vi[i]]>dis[from[i]]+cost[i])
{
flag=false;
break;
}
}
return flag;
}
void addedge(int u,int v,int w)
{
from[e]=u;
vi[e]=v;
cost[e]=w;
e++;
}
int main()
{
char ch;
int u,v,w;
while(~scanf("%d%d",&n,&m))
{
e=0;
for(int i=0;i<m;i++)
{
getchar();
scanf("%c",&ch);
if(ch=='P')
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,-w);
addedge(v,u,w);
}
else
{
scanf("%d%d",&u,&v);
addedge(u,v,-1);
}
}
if(bellman())
printf("Reliable\n");
else
printf("Unreliable\n");
}
return 0;
}