也是典型的差分约束的题目。
对于有提供两点间精确距离的情况要在两点间添加两条互相反向的边。
用bellman-ford判断图中是否有负环即可。
#include<iostream> #include<stdio.h> #include<string.h> #define MAXD 5000 using namespace std; int N,M,u[MAXD*100],v[MAXD*100],w[MAXD*100],head[MAXD],next[MAXD*100],e,dis[MAXD]; void add(int x,int y,int z) { u[e]=x; v[e]=y; w[e]=z; next[e]=head[x]; head[x]=e++; } int bellman() { int k,i,j; for(k=1;k<=N;k++) { for(i=0;i<e;i++) { if(dis[v[i]]>dis[u[i]]+w[i]) dis[v[i]]=dis[u[i]]+w[i]; } } for(i=0;i<e;i++) { if(dis[v[i]]>dis[u[i]]+w[i]) return 0; } return 1; } int main() { //freopen("test.txt","r",stdin); while(scanf("%d%d",&N,&M)!=EOF) { int i,j,a,b,x; char ch[2]; e=0; memset(head,-1,sizeof(head)); for(i=1;i<=M;i++) { scanf("%s",ch); if(ch[0]=='P') { scanf("%d%d%d",&a,&b,&x); add(b,a,x); add(a,b,(-1)*x); } else { scanf("%d%d",&a,&b); add(a,b,-1); } } if(bellman()) printf("Reliable\n"); else printf("Unreliable\n"); } return 0; }