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),然后最短路就行了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 const int maxn=1005;
 6 const int maxm=30005;
 7 const int INF=0x3f3f3f3f;
 8
 9 int head[maxn],nxt[maxm],point[maxm],val[maxm],size;
10 int vis[maxn],dis[maxn],n,num[maxn];
11
12 void add(int a,int b,int v){
13     val[size]=v;
14     point[size]=b;
15     nxt[size]=head[a];
16     head[a]=size++;
17 }
18
19 int spfa(){
20     memset(vis,0,sizeof(vis));
21     memset(dis,0x3f,sizeof(dis));
22     memset(num,0,sizeof(num));
23     queue<int>q;
24     vis[1]=1;
25     dis[1]=0;
26     q.push(1);
27     while(!q.empty()){
28         int u=q.front();
29         q.pop();
30         vis[u]=0;
31         for(int i=head[u];~i;i=nxt[i]){
32             int j=point[i];
33             if(dis[j]>dis[u]+val[i]){
34                 dis[j]=dis[u]+val[i];
35                 if(!vis[j]){
36                     q.push(j);
37                     vis[j]=1;
38                     if(++num[j]>n)return 1;
39                 }
40             }
41         }
42     }
43     return 0;
44 }
45
46 int main(){
47     int ml,md;
48     scanf("%d%d%d",&n,&ml,&md);
49     size=0;
50     memset(head,-1,sizeof(head));
51     while(ml--){
52         int a,b,v;
53         scanf("%d%d%d",&a,&b,&v);
54         add(a,b,v);
55     }
56     while(md--){
57         int a,b,v;
58         scanf("%d%d%d",&a,&b,&v);
59         add(b,a,-v);
60     }
61     for(int i=1;i<n;++i)add(i+1,i,0);
62     if(spfa())printf("-1\n");
63     else if(dis[n]==INF)printf("-2\n");
64     else printf("%d\n",dis[n]);
65     return 0;
66 }

时间: 2024-08-05 12:35:19

poj3169 最短路(差分约束)的相关文章

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

K - Candies(最短路+差分约束)

题目大意:给N个小屁孩分糖果,每个小屁孩都有一个期望,比如A最多比B多C个,再多了就不行了,会打架的,求N最多比1多几块糖 分析:就是求一个极小极大值...试试看 这里需要用到一个查分约束的东西 下面是查分约束详解: 一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问你是否满足有解的问题 好神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面开始详细介绍下 比如给出三个不等式,b-a<=k1,c-b<=k2,c-a<

poj3169——Layout(差分约束+SPFA判断负环)

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 are numbe

【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

poj3159 最短路(差分约束)

题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个. 这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 a 多 c 个,也就是 d[b] - d[a] ≤ c,就可以建立 value 值为 c 的单向边 e(a,b) ,然后先定d[1] = 0 ,用最短路跑完得到的 d[n] 就是所求答案. 1 #include<stdio.h> 2 #include<string.h> 3 #incl

训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - BellmanFord - 图论 - 训练指南 - 差分约束 Halum UVA - 11478 题意 带权有向图,每个点都可以有如下操作:令从ta出发的每一条边增加d,终止于ta的每一条边减小d 最后让所有边权的最小值非负且尽量大 题

UVA 11478 - Halum(差分约束+最短路)

UVA 11478 - Halum 题目链接 题意:给定一个有向图,每次操作可以选择一个结点,把以这个点为起点的边权值+d,以这个边为终点的-d,问经过操作后,能得到的边权最小的最大值是多少,并且要判但是否无穷大或无解 思路:转化为差分约束,设一条边,他增加的权值为sum(u)减少了sum(v),那么二分答案x,得到一个不等式sum(u) - sum(v) + w(u, v) >= x,变形后得到sum(v) - sum(u) <= w(u, v) - x,这样就转化为了差分约束,直接bell

POJ 3169 Layout (差分约束)

题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个,D[i] - D[i+1] <= 0,  D[j] -D[i ]<= k, D[i] - D[j] <= - k,那么这个题就可以用差分约束来求这个不等式组了. 1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值(本题求的就

BZOJ 3436: 小K的农场 差分约束

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c  ->  d[v]<=d[u]+w  ->  建一条边从a到b,权值为-c 2.a<=b+c  ->  d[v]<=d[u]+w  -> 建一条边从b到a,权值为c 3.a==b  ->  d[v]<=d[u]+0&&d[u]<=d