POJ3169

题目链接:http://poj.org/problem?id=3169

AC思路:

  设各牛的位置为x[ ]。

  对于感情好的牛,即第2到ML+1行:A B D, 有x[B] - x[A] <=D.而对于感情不好的牛,即第ML+2到ML+MD+1行: A B D, 则有x[B] - x[A] >=D,可以转化为x[A] - x[B] <= -D.

  这是一个差分约束题,第一类式子x[B] - x[A] <=D可以看成是从点B到点A的边权为D,而第二类式子也可以转换成x[A] - x[B] <= -D,看成是从点A到点B的负权边。

  最终目的是要求 x[N] - x[1]的最大值,其实就是从N点出发到 1点的单源最短路问题。理解了差分约束这个概念,这道题就不难了。

AC代码:

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxv=1000+3,maxe=20000+3;
 6 const int inf=0x7ffffff;
 7 int edgecount,N;
 8 int head[maxv],d[maxv],visitcount[maxv];
 9 bool inq[maxv];
10 queue<pair<int,int> > q;
11 struct edge{
12     int from,to,val,next;
13     edge(){}
14     edge(int _f,int _t,int _v,int _n){
15         from=_f,to=_t,val=_v,next=_n;
16     }
17 }es[maxe];
18 void addedge(int from,int to,int val){
19     es[edgecount]=edge(from,to,val,head[from]);
20 //    printf("es[%d] = (%d,%d,%d,%d)\n",edgecount,from,to,val,head[from]);
21     head[from]=edgecount++;
22 }
23 bool spfa(int s){
24     for(int i=1;i<=N;i++){
25         d[i]=inf;
26         inq[i]=(i==s);
27         visitcount[i]=0;
28     }
29     d[s]=0;
30     q.push(make_pair(d[s],s));
31     while(!q.empty()){
32         int dist=q.front().first,u=q.front().second;
33         q.pop();
34         inq[u]=false;
35         if(visitcount[u]++>N)   return true;
36         for(int e=head[u];e!=-1;e=es[e].next){
37             int t=es[e].to,value=es[e].val;
38             if(d[t]>d[u]+value){
39                 d[t]=d[u]+value;
40                 if(!inq[t]){
41                     inq[t]=true;
42                     q.push(make_pair(d[t],t));
43                 }
44             }
45         }
46     }
47     return false;
48 }
49 int main()
50 {
51     memset(head,-1,sizeof(head));
52     int ML,MD,A,B,D;    edgecount=0;
53     scanf("%d%d%d",&N,&ML,&MD);
54     while(ML--){
55         scanf("%d%d%d",&A,&B,&D);
56         addedge(B,A,D);
57     }
58     while(MD--){
59         scanf("%d%d%d",&A,&B,&D);
60         addedge(A,B,-D);
61     }
62
63     if(spfa(N)) printf("-1\n");
64     else if(d[1]==inf)  printf("-2\n");
65     else    printf("%d\n",d[1]);
66  //   for(int i=1;i<=N;i++)   printf("%d\n",d[i]);
67     return 0;
68 }

时间: 2024-10-12 13:18:36

POJ3169的相关文章

POJ-3169 Layout---差分约束系统+Bellman

题目链接: https://vjudge.net/problem/POJ-3169 题目大意: 一些母牛按序号排成一条直线.有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没有输出-1,如果可以随便排输出-2,否则输出最大的距离. Sample Input 4 2 1 1 3 10 2 4 20 2 3 3 Sample Output 27 思路: 设xi为第i头牛的x坐标 对于第一种要求,A和B之间距离不超过X(题目中A<B) 那就有:xB - xA <

【POJ3169 】Layout (认真的做差分约束)

Layout Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a straight line waiting for feed. The cows are standing in the same order as they ar

poj3169 最短路(差分约束)

题意:一个农夫有n头牛,他希望将这些牛按照编号 1-n排成一条直线,允许有几头牛站在同一点,但是必须按照顺序,有一些牛关系比较好,希望站的距离不超过某个值,而有一些牛关系不太好,所以希望站的距离大于等于某个值,问1号牛和n号牛之间的最远距离是多少. 差分约束的裸题,对于 d[v] - d[u] ≤ w 建立权值为 w 的单向边 e(u,v),对于 d[v] - d[u]  ≥ w 建立权值为 -w 的单向边 e(v,u),然后再根据牛必须按顺序排列建立权值为 0 的边 e(i+1,i),然后最短

POJ3169 Layout (差分约束系统)

传送门 题意:有N头牛,第i头牛一定在第i-1头和第i+1头中间(按照编号从小到大排列)给出两种约束 1. A 到 B 的距离不超过 D 2. A 到 B 的距离小于 D 要求第N头到第一头的距离最远.若无解,输出-1,若无限远,输出-2. 用dis(i)表示从第一头牛到第i头牛的距离,所以 -对于条件1有:dis(A) + D >= dis(B) 连一条从A到B的有向边权值为D(因为最大为D--) -对于条件2有:dis(A) + D <= dis(B),变形为dis(B) - D >

POJ3169 Layout【SPFA】【差分约束】

Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7608 Accepted: 3653 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a str

poj3169 差分约束系统

题意: 从1到n,n个数,从左向右一次排列.给定两种形式的约束条件: 1.xi与yi的最大距离为dk 2.xi与yi的最小距离为dk 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条件相互矛盾则输出-1,若最大距离可以为无穷大则输出-2) 知识补充: 差分约束系统的概念:由n个变量和m个约束条件(实数)组成,且都是形如: xi?yj≤bk(x,y为变量,b为实数) 的形式. 用Bellman-Ford算法求解差分约束系统:由于最短路三角不等式:d[v]?d[u]≤e[u,v]与差

POJ3169差分约束系统

题意:有n头牛,编号为1到n,对于关系好的ml头牛,al和bl之间的距离不大于dl,关系差的md头牛,ad和bd之间的距离不大于dd,求第1头牛和第n头牛之间的距离 分析:这是一道差分约束系统的题目,先来看一下查分约束系统的资料 http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 于是上述问题可以转换成最短路问题来求解,设d[i]为第1个顶点到第i个顶点的最短距离,d[al[i]]+dl[i]>=d[bl[i]],于是d[bl[

POJ3169 Layout 【差分约束系统】

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7468   Accepted: 3581 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

POJ3169(最短路+差分约束)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7613   Accepted: 3658 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a