题目链接:点击打开链接
题目大意:给定n个点,m条信息,信息包含两种,一种是P,给定u,v,w代表u点在v点的北方w光年处,一种是V,给定u,v代表u在v的北方至少1光年处,判断给定信息的真假。
题目解析:建立图,跑最长路,判断是不是有矛盾即正环,SPFA,要判断自环。
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define Pair pair<int,int>
const int INF = 0x3f3f3f3f;
using namespace std;
struct node{
int v,w,next;
}arr[200005];
int head[1005],tot,n,m;
int dis[1005],du[1005];
bool vis[1005];
char op[5];
void add_edge(int u,int v,int w){
arr[tot].v = v;
arr[tot].w = w;
arr[tot].next = head[u];
head[u] = tot++;
}
bool spfa(){
queue<int>Q;
for(int i=1;i<=n;i++){
dis[i] = 0;
vis[i] = true;
du[i] = 1;
Q.push(i);
}
while(!Q.empty()){
int u = Q.front();Q.pop();
if(du[u] > n){
return false;
}
for(int i=head[u];i!=-1;i=arr[i].next){
int v = arr[i].v;
if(dis[v] < dis[u] + arr[i].w){
dis[v] = dis[u] + arr[i].w;
if(!vis[v]){
Q.push(v);
vis[v] = true;
du[v] += 1;
}
}
}
vis[u] = false;
}
return true;
}
int main(){
while(~scanf("%d %d",&n,&m)){
tot = 0;
bool flag = false;
memset(head,-1,sizeof(head));
for(int i = 1,u,v,w;i <= m; i++){
scanf("%s",op);
if(op[0] == 'P'){
scanf("%d %d %d",&u,&v,&w);
if(u == v && w != 0){
flag = true;
}
add_edge(u,v,w);
add_edge(v,u,-w);
}
else{
scanf("%d %d",&u,&v);
if(u == v){
flag = true;
}
add_edge(u,v,1);
}
}
if(flag || !spfa())
printf("Unreliable\n");
else
printf("Reliable\n");
}
return 0;
}