大致题意:给出一些点的精确信息和模糊信息,精确信息给出两点的位置和距离,模糊信息给出两点的位置,但距离大于等于一。试确定是否所有的信息满足条件。
这道题让我对差分约束系统有了进一步的认识。设dist[i]表示源点到i的距离,精确条件可以判断出两个差分条件:假如a->b为c则可以写成c>=dist[b]-dist[a]>=c;所以可得dist[b]<=dist[a]+c , dist[a]<=dist[b]-c;这就说明a到b有一条长度为c的边,b到a有一条长度为-c的边。模糊信息可以确定一个差分条件由dist[b]-dist[a]>=1可得:dist[a]<=dist[b]-1,说明b到a有一条长度为-1的边。差分条件都找出来后在求最短路看是否有负环。
#include<iostream> #include<queue> #include<cstring> using namespace std; #define MAX_INT 123456789 struct node { int v; int value; int next; }; int visit[1001],head[1001],counter[1001],dist[1001],N; node edge[1000000]; queue <int> Q; int spfa(int n) { int i,k,tail,front,e; while(!Q.empty()) Q.pop(); for(tail=front=0,i=1;i<=n;i++) { dist[i]=MAX_INT; Q.push(i); visit[i]=1; } memset(counter,0,sizeof(counter)); while(!Q.empty()) { e=Q.front(),Q.pop(); visit[e]=0; if(dist[e]==MAX_INT) dist[e]=0; for(i=head[e];i;i=edge[i].next) { k=edge[i].v; if(dist[k]>dist[e]+edge[i].value) { dist[k]=dist[e]+edge[i].value; if(!visit[k]) { Q.push(k); visit[k]=1; if(++counter[k]>n-1) return 0; } } } } return 1; } int add(int s,int t,int w) { node e={t,w,0}; edge[N]=e; edge[N].next=head[s]; head[s]=N++; return 0; } int main() { int i,s,t,w,m,n; char c; //freopen("in.txt", "r", stdin); //freopen("out.txt","w", stdout); while(cin>>n>>m) { memset(head,0,sizeof(head)); for(N=1,i=0;i<m;i++) { cin>>c; if(c=='P') { cin>>s>>t>>w; add(s,t,w); add(t,s,-w); } else if(c=='V') { cin>>s>>t; add(t,s,-1); } getchar(); } if(spfa(n)) cout<<"Reliable"<<endl; else cout<<"Unreliable"<<endl; } return 0; }
附上几组测试数据:
input:
2 8
P 1 2 -4
P 1 1 5
V 2 2
V 2 1
V 1 2
P 1 2 -2
V 1 1
V 2 1
2 9
V 1 2
V 2 1
V 2 1
V 2 1
V 2 2
P 2 1 2
V 2 2
V 2 1
P 2 1 -2
7 1
P 1 4 6
1 10
P 1 1 1
P 1 1 -4
P 1 1 6
P 1 1 6
V 1 1
P 1 1 3
V 1 1
P 1 1 -3
V 1 1
P 1 1 7
8 3
P 3 2 6
V 8 7
V 5 7
1 2
P 1 1 7
V 1 1
8 4
V 2 6
V 7 6
P 7 3 -6
V 1 5
2 3
V 1 2
P 2 1 3
V 1 1
2 7
P 1 1 -1
V 1 1
V 1 2
V 1 1
P 1 2 -7
V 1 2
V 2 1
8 4
P 6 1 5
P 2 8 -6
V 1 1
P 2 6 2
6 4
V 2 4
P 6 3 0
P 1 3 8
V 3 2
8 3
P 3 5 8
P 2 7 1
P 5 8 -2
3 6
P 3 2 6
V 2 1
P 1 3 -8
V 2 3
V 1 2
V 3 3
1 1
V 1 1
9 2
V 1 8
P 2 9 -5
7 8
V 5 7
V 6 4
V 6 5
P 7 6 -5
V 1 7
V 1 5
V 5 6
V 6 7
10 10
V 7 10
V 6 8
P 7 6 -8
V 5 5
V 7 2
P 4 4 5
V 3 9
P 6 4 6
P 7 3 -1
P 3 10 1
1 4
P 1 1 2
V 1 1
P 1 1 6
P 1 1 8
6 9
V 3 2
V 5 3
P 1 3 2
V 3 6
V 1 6
V 3 6
P 3 6 -2
V 2 3
V 6 4
4 5
V 1 2
V 4 1
V 2 2
V 1 3
P 3 1 0
output:
Unreliable
Unreliable
Reliable
Unreliable
Reliable
Unreliable
Reliable
Unreliable
Unreliable
Unreliable
Reliable
Reliable
Unreliable
Unreliable
Reliable
Unreliable
Unreliable
Unreliable
Unreliable
Unreliable