如题:http://poj.org/problem?id=3169
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7711 | Accepted: 3708 |
Description
Some cows like each other and want to be within a certain distance of each other in line. Some really dislike each other and want to be separated by at least a certain distance. A list of ML (1 <= ML <= 10,000) constraints describes which cows like each other and the maximum distance by which they may be separated; a subsequent list of MD constraints (1 <= MD <= 10,000) tells which cows dislike each other and the minimum distance by which they must be separated.
Your job is to compute, if possible, the maximum possible distance between cow 1 and cow N that satisfies the distance constraints.
Input
Lines 2..ML+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at most D (1 <= D <= 1,000,000) apart.
Lines ML+2..ML+MD+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at least D (1 <= D <= 1,000,000) apart.
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
There are 4 cows. Cows #1 and #3 must be no more than 10 units apart, cows #2 and #4 must be no more than 20 units apart, and cows #2 and #3 dislike each other and must be no fewer than 3 units apart.
The best layout, in terms of coordinates on a number line, is to put cow #1 at 0, cow #2 at 7, cow #3 at 10, and cow #4 at 27.
差分约束系统的基础题,给出几个关系,让求出1号牛和N号牛在满足条件下的最大距离,规定一些关系好的牛XL,YL距离要小于DL,一些关系不好的牛XD,YD距离要大于DD。
并且牛是站成一排的,一个位置上可以由多个牛。
设牛i站的位置是d[i]。
满足上述条件不等式:
1.d[i]<=d[i+1]
2.d[AL]+DL>=d[BL]
3.d[BD]-DD>=d[AD]
这3个不等式都有一个特点,2个变量在两边,中间是一个常数,将他们变形。
1.d[i+1]+0>=d[i]
2.d[AL]+DL>=d[BL]
3.d[BD]-DD>=d[AD];
是不是很像图中的单源最短路,单源最短路任意两点满足dist[u]+cost(u,v)>=dist[v];
因此,由第一个不等式,在顶点i+1连一条边到顶点i,权值是0,由第二个不等式,在顶点AL连一条边到BL,权值是DL,由第三个不等式,在顶点BD连一条边到AD,权值是-DD。
因为存在负权,使用Bellman_ford求出源点1的最短路径。
结果就是d[N]-d[1].
存在负权环无解,==INF 输出-2.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define MAXV 1005
#define MAXE 20005
#define INF 0x0fffffff
struct edge
{
int to,cost;
edge(int a,int b):to(a),cost(b){}
};
vector<edge>G[MAXE];
int N,ML,MD;
int d[MAXV];
void Bellman_ford(int s)
{
int i,j,k;
for(i=0;i<MAXV;i++)
d[i]=INF;
d[s]=0;
int flag=0;
for(i=0;i<N;i++)
{
for(j=1;j<=N;j++)
for(k=0;k<G[j].size();k++)
{
edge e=G[j][k];
if(d[e.to]>d[j]+e.cost)
{
d[e.to]=d[j]+e.cost;
if(i==N-1)
flag=1;
}
}
}
if(flag)
printf("-1\n");
else if(d[N]==INF)
printf("-2\n");
else
printf("%d\n",d[N]);
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
scanf("%d%d%d",&N,&ML,&MD);
int i;
for(i=1;i<N;i++)
{
G[i+1].push_back(edge(i,0));
}
for(i=0;i<ML;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(edge(b,c));
}
for(i=0;i<MD;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[b].push_back(edge(a,-c));
}
Bellman_ford(1);
return 0;
}