题意:给定一些母牛,要求一个排列,有的母牛距离不能超过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 的边,求的是最短路,得到的是最大值(本题求的就是最大值),对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值。

2.如果检测到负环,那么无解。

3.如果d[n]没有更新,那么可以是任意解。

代码如下:

  1. #include <cstdio>
  2. #include <string>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <cstring>
  7. #include <set>
  8. #include <queue>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <map>
  12. using namespace std ;
  13. typedef long long LL;
  14. typedef pair<int, int> P;
  15. const int INF = 0x3f3f3f3f;
  16. const double inf = 0x3f3f3f3f3f3f3f;
  17. const double eps = 1e-8;
  18. const int maxn = 10000 + 5;
  19. const int dr[] = {0, 0, -1, 1};
  20. const int dc[] = {-1, 1, 0, 0};
  21. int n, m;
  22. struct node{
  23. int to, w, next, from;
  24. };
  25. int cnt = 0;
  26. node G[maxn<<1];
  27. int d[maxn];
  28.  
  29. void add(int u, int v, int w){
  30. G[cnt].w = w;
  31. G[cnt].to = v;
  32. G[cnt++].from = u;
  33. }
  34.  
  35. bool Bell_Ford(){
  36. for(int i = 1; i <= n; ++i) d[i] = INF;
  37.  
  38. d[1] = 0;
  39. for(int i = 0; i < n; ++i){
  40. for(int j = 0; j < cnt; ++j){
  41. int u = G[j].from;
  42. int v = G[j].to;
  43. int w = G[j].w;
  44. if(d[u] < INF && d[v] > d[u] + w){
  45. d[v] = d[u] + w;
  46. }
  47. }
  48. }
  49.  
  50. for(int j = 0; j < cnt; ++j){
  51. int u = G[j].from;
  52. int v = G[j].to;
  53. int w = G[j].w;
  54. if(d[u] < INF && d[v] > d[u] + w)
  55. return true;
  56. }
  57.  
  58. return false;
  59. }
  60.  
  61. int main(){
  62. // freopen("in.txt", "r", stdin);
  63. int ml, md, u, v, w;
  64. cin >> n >> ml >> md;
  65. cnt = 0;
  66.  
  67. for(int i = 0; i < ml; ++i){
  68. scanf("%d %d %d", &u, &v, &w);
  69. if(u < v) swap(u, v);
  70. add(v, u, w);
  71. }
  72.  
  73. for(int i = 0; i < md; ++i){
  74. scanf("%d %d %d", &u, &v, &w);
  75. if(u < v) swap(u, v);
  76. add(u, v, -w);
  77. }
  78.  
  79. if(Bell_Ford()) printf("-1\n");
  80. else if(d[n] == INF) printf("-2\n");
  81. else printf("%d\n", d[n]);
  82. return 0;
  83. }

POJ 3169 Layout (差分约束)的更多相关文章

  1. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  2. POJ 3169 Layout(差分约束啊)

    题目链接:http://poj.org/problem? id=3169 Description Like everyone else, cows like to stand close to the ...

  3. poj 3169 Layout 差分约束模板题

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6415   Accepted: 3098 Descriptio ...

  4. POJ 3169 Layout(差分约束 线性差分约束)

    题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距 ...

  5. ShortestPath:Layout(POJ 3169)(差分约束的应用)

                布局 题目大意:有N头牛,编号1-N,按编号排成一排准备吃东西,有些牛的关系比较好,所以希望他们不超过一定的距离,也有一些牛的关系很不好,所以希望彼此之间要满足某个关系,牛可以 ...

  6. poj 3169&hdu3592(差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9687   Accepted: 4647 Descriptio ...

  7. Bellman-Ford算法:POJ No.3169 Layout 差分约束

    #define _CRT_SECURE_NO_WARNINGS /* 4 2 1 1 3 10 2 4 20 2 3 3 */ #include <iostream> #include & ...

  8. POJ 3169 Layout 差分约束系统

    介绍下差分约束系统:就是多个2未知数不等式形如(a-b<=k)的形式 问你有没有解,或者求两个未知数的最大差或者最小差 转化为最短路(或最长路) 1:求最小差的时候,不等式转化为b-a>= ...

  9. POJ 3169 Layout (spfa+差分约束)

    题目链接:http://poj.org/problem?id=3169 差分约束的解释:http://www.cnblogs.com/void/archive/2011/08/26/2153928.h ...

随机推荐

  1. 进程描述符task_struct

    1.进程状态 volatile long state; int exit_state; state成员的可能取值如下: #define TASK_RUNNING        0 #define TA ...

  2. POJ 3692 Kindergarten (补图是二分图的最大团问题)

    题意 幼稚园里有m个男孩和n个女孩(m.n范围都是[1,200]),男孩之间相互认识,女孩之间也相互认识,另外有部分男孩和女孩也认识.现在要举办一个活动,选取一些同学,要求所有选取的同学之间两两相互认 ...

  3. 介绍 Android 的 Camera 框架

    总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...

  4. Windows pyqt4 bat自动转换UI文件-->.pyw文件

    /***************************************************************************** * Windows pyqt4 bat自动 ...

  5. Android 动画 6问6答

    1.view 动画有哪些需要注意的? 答:view动画 本身比较简单.http://www.cnblogs.com/punkisnotdead/p/5179115.html 看这篇文章的第五问就可以了 ...

  6. windows 不能在本地计算机启动apache2 的解决方法(不是修改端口)

    使用命令行运行apache目录下的httpd程序,它会提示哪里出错了,修改即可 D:\Program Files (x86)\Apache2.\bin\httpd

  7. shell 中数学计算总结

    shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看,呵呵.   1.错误方法举例   a)   var=1+1   echo $var  ...

  8. 8、NFC技术:让Android自动打开网页

    创建封装Uri的NdefRecord  public  NdefRecord  createUri(String  uriString);  public  NdefRecord  cre ...

  9. android启动页优化实践

    最近观看友盟统计发现App启动页跳出率很高,观看启动页的平均启动时间为2.8s,如下图: 所以一个很现实的问题就出来了,优化启动页面... (一)做了什么? 我们的启动页面主要用于展示启动页面,加载网 ...

  10. MVC的路由

    MVC的路由包括以下几部分 路由名称,路由URL,路由的初始值,路由的约束,路由的命名空间 routes.MapRoute( name: "Default", url: " ...