链接:点击打开链接
题意:给出n个点,和m种关系,看是否能够满足所有关系,关系的形式有两种一种是u-v=w,一种是u-v>=1
代码:
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,d[1005],deg[1005],vis[1005];
struct node{
int to,val;
};
vector<node> G[1005];
int spfa(int S){
int i,u,v,w;
for(i=0;i<=n;i++){
d[i]=INF;
vis[i]=deg[i]=0;
}
queue<int> qu;
d[S]=0,deg[S]=vis[S]=1;
qu.push(S);
while(qu.size()){
u=qu.front();
qu.pop();
vis[u]=0;
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(vis[v]==0){
deg[v]++;
if(deg[v]>n)
return 0;
qu.push(v);
}
}
}
}
return 1;
}
int main(){
char ch;
int m,u,v,w,i;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<=n;i++) //三个约束条件
G[i].clear(); //u-v<=w
for(i=1;i<=m;i++){ //v-u<=-w
cin>>ch; //v-u<=1
if(ch=='P'){ //直接差分约束,跑最短路,看是否有负环
scanf("%d%d%d",&u,&v,&w);
G[v].push_back((node){u,w});
G[u].push_back((node){v,-w});
}
else{
scanf("%d%d",&u,&v);
G[u].push_back((node){v,-1});
}
}
for(i=1;i<=n;i++) //建一个超级源点使图联通
G[0].push_back((node){i,0});
if(spfa(0))
puts("Reliable");
else
puts("Unreliable");
}
return 0;
}