poj 2983 差分约束
大致题意:给出一些点的精确信息和模糊信息,精确信息给出两点的位置和距离,模糊信息给出两点的位置,但距离大于等于一。试确定是否所有的信息满足条件。
这道题让我对差分约束系统有了进一步的认识。设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
浙公网安备 33010602011771号