题意:
给N个点,M条信息。
1、P A B X, A在B的北面X光年处
2、V A B ,A在B的北面,但是不知道确切距离,最少一光年。
对于给出的M条信息,看是否有冲突,若有冲突,输出Unreliable;否则,输出Reliable。
注意:自身有可能有冲突。另外,需要建立一个超级源点。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 99991
using namespace std;
struct node{
int to;
int d;
}now;
vector<node>vec[1100];
int n,m;
bool vis[1100];
int dis[1100];
int du[1100];
bool spfa(){
memset(dis,-inf,sizeof(dis));
memset(du,0,sizeof(du));
memset(vis,false,sizeof(vis));
queue<int>q;
q.push(0);
dis[0] = 0;
vis[0] = true;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
//cout<<u<<endl;
du[u]++;
if(du[u] > n){
return true;
}
for(int i = 0; i < vec[u].size(); ++i){
int v = vec[u][i].to;
int d = vec[u][i].d;
if(dis[v] < dis[u]+d){
dis[v] = dis[u]+d;
if(!vis[v]){
vis[v] = true;
q.push(v);
}
}
}
}
return false;
}
int main(){
char str[10];
int u,v,w;
//freopen("out.txt","w",stdout);
while(~scanf("%d%d",&n,&m)){
for(int i = 0; i <= n; ++i){
vec[i].clear();
}
bool flag = false;
while(m--){
scanf("%s",str);
if(str[0]=='P'){
scanf("%d%d%d",&u,&v,&w);
if(u==v&&w){//判断自身
flag = true;
}
now.to = u;
now.d = w;
vec[v].push_back(now);
now.to = v;
now.d = -w;
vec[u].push_back(now);
}
else{
scanf("%d%d",&u,&v);
now.to = u;
now.d = 1;
vec[v].push_back(now);
}
}
for(int i = 1; i <= n; ++i){
now.to = i;
now.d = 0;
vec[0].push_back(now);
}
if(flag||spfa()){
printf("Unreliable\n");
}
else{
printf("Reliable\n");
}
}
return 0;
}