题目:传送门。
分析:差分约束系统基础题,建完图套SPFA就ok了。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=1005;
const int MAXM=1e5;
const int INF=0x3f3f3f3f;
int n,m,cnt;
struct EDGE{
int v,w,next;
};
EDGE edge[MAXM*3];
int dis[MAXN],head[MAXN],counte[MAXN];
bool vis[MAXN];
deque<int> q;
void initi(){
for(int i=0;i<=n;++i){
counte[i]=0;
head[i]=-1;
dis[i]=-INF;
vis[i]=false;
}
cnt=0;
}
void addEdge(int u,int v,int w){
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void read(){
int u,v,w;
char c;
while(m--){
cin>>c;
if(c=='P'){
cin>>v>>u>>w;
addEdge(u,v,w);
addEdge(v,u,-w);
}
else{
cin>>v>>u;
addEdge(u,v,1);
}
}
for(int i=1;i<=n;++i) addEdge(0,i,0);
}
bool SPFA(){
q.push_back(0);
dis[0]=0; vis[0]=true; counte[0]=1;
while(!q.empty()){
int u=q.front(); q.pop_front();
vis[u]=false;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(dis[v]<dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;
if(!vis[v]){
if(++counte[v]>n) return false;
vis[v]=true;
if(!q.empty()&&dis[v]<dis[q.front()]) q.push_back(v);
else q.push_front(v);
}
}
}
}
return true;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>m){
initi();
read();
if( SPFA() ) cout<<"Reliable"<<endl;
else cout<<"Unreliable"<<endl;
}
return 0;
}