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

差分约束的解释:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html

我也不是特别理解,要是给你a - b <= k 就建一条b->a权值为k的有向边,要是a - b >= k 就建一条a -> b边权是-k的有向边,要是让你求n到1的最大差,就是让你求1到n的最短距离。

差分约束系统有两种方式可以求解,最短路和最长路。当我们把不等式整理成d[a]+w<=d[b]时,我们求最长路。整理成d[a]+w>=d[b]时,我们求最短路。当求最短路时,我们通常要把各点距离初始化为正无穷,求最短路,把各点距离逐渐减小,直到符合所有不等式。也就是开始各点不符合条件,后来通过减小变得符合了,所以一定是符合条件的最大值。既然是求最大值,并且是减小各点距离,也就是把各点由数轴的右侧向左侧拉,所以我们一定要选择一个最终在数轴最左侧的点,并初始化为0,把所有正无穷的点拉近到符合不等式。最长路同理。(转来的)

题目就是让你求1到n的最短距离,要是有负环输出-1,要是d[n]没有更新就输出-2。

我用spfa做的,但是题目有个隐含的条件是D[i + 1] - D[i] >= 0。所以还要建i + 1到i上的0边。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <queue>
  6. using namespace std;
  7. const int MAXN = ;
  8. const int INF = 1e9;
  9. struct data {
  10. int next , to , cost;
  11. }edge[MAXN * MAXN];
  12. int head[MAXN] , d[MAXN] , cont , cnt[MAXN];
  13. bool vis[MAXN];
  14.  
  15. void init(int n) {
  16. for(int i = ; i <= n ; i++) {
  17. d[i] = INF;
  18. head[i] = -;
  19. vis[i] = false;
  20. cnt[i] = ;
  21. }
  22. cont = ;
  23. }
  24.  
  25. inline void add(int u , int v , int cost) {
  26. edge[cont].next = head[u];
  27. edge[cont].to = v;
  28. edge[cont].cost = cost;
  29. head[u] = cont++;
  30. }
  31.  
  32. bool spfa(int s , int n) {
  33. d[s] = ;
  34. queue <int> que;
  35. while(!que.empty()) {
  36. que.pop();
  37. }
  38. que.push(s);
  39. while(!que.empty()) {
  40. int temp = que.front();
  41. que.pop();
  42. vis[temp] = false;
  43. for(int i = head[temp] ; ~i ; i = edge[i].next) {
  44. int v = edge[i].to;
  45. if(d[v] > d[temp] + edge[i].cost) {
  46. d[v] = d[temp] + edge[i].cost;
  47. if(!vis[v]) {
  48. que.push(v);
  49. vis[v] = true;
  50. }
  51. cnt[v]++;
  52. if(cnt[v] >= n)
  53. return false;
  54. }
  55. }
  56. }
  57. return true;
  58. }
  59.  
  60. int main()
  61. {
  62. int n , m1 , m2 , u , v , w;
  63. while(~scanf("%d %d %d" , &n , &m1 , &m2)) {
  64. init(n);
  65. while(m1--) {
  66. scanf("%d %d %d" , &u , &v , &w);
  67. add(u , v , w);
  68. }
  69. while(m2--) {
  70. scanf("%d %d %d" , &u , &v , &w);
  71. add(v , u , -w);
  72. }
  73. //隐含条件
  74. for(int i = ; i < n ; i++) {
  75. add(i + , i , );
  76. }
  77. if(spfa( , n)) {
  78. if(d[n] >= INF)
  79. printf("-2\n");
  80. else
  81. printf("%d\n" , d[n]);
  82. }
  83. else
  84. printf("-1\n");
  85. }
  86. }

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

  1. poj 3169 Layout(差分约束+spfa)

    题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有m ...

  2. (简单) POJ 3169 Layout,差分约束+SPFA。

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  3. POJ 3169 Layout 【差分约束】+【spfa】

    <题目链接> 题目大意: 一些母牛按序号排成一条直线.有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没有最大距离输出-1,如果1.n之间距离任意就 ...

  4. poj 3169 Layout (差分约束)

    3169 -- Layout 继续差分约束. 这题要判起点终点是否连通,并且要判负环,所以要用到spfa. 对于ML的边,要求两者之间距离要小于给定值,于是构建(a)->(b)=c的边.同理,对 ...

  5. POJ 3169 Layout(差分约束+最短路)题解

    题意:有一串数字1~n,按顺序排序,给两种要求,一是给定u,v保证pos[v] - pos[u] <= w:二是给定u,v保证pos[v] - pos[u] >= w.求pos[n] - ...

  6. poj 3169 Layout(差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6549   Accepted: 3168 Descriptio ...

  7. POJ 3167 Layout(差分约束)

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

  8. POJ 3169 Layout (差分约束系统)

    Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...

  9. O - Layout(差分约束 + spfa)

    O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...

随机推荐

  1. uva 111 - History Grading (dp, LCS)

    题目链接 题意:给N,第二行是答案,n个数c1---cn, 代表第一个的顺序是c1,第二个数顺序是c2; 下面每一行是学生的答案,格式同上. 注意:这个给的顺序需要处理一下,不能直接用. 思路:LCS ...

  2. iOS开发:在Swift中调用oc库

    先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...

  3. UVa 10596 Moring Walk【欧拉回路】

    题意:给出n个点,m条路,问能否走完m条路. 自己做的时候= =三下两下用并查集做了交,WA了一发-后来又WA了好几发--(而且也是判断了连通性的啊) 搜了题解= = 发现是这样的: 因为只要求走完所 ...

  4. xcode6.3 编译ffmpeg 2.6.3(已验证编译成功)

    1.解压ffmpeg2.6.3源代码,在根目录下新建文件myconfig,内容如下,执行命令chmod 777 ./myconfig 2../myconfig 3.make 4.make instal ...

  5. POJ 1833 排列

    题意: 给你某个排列 求从下一个排列开始的第k个排列如果是最后一个排列 则下一个排列为1 2 3 ... n// 1 用stl 里面的 next_permutation// 2 用生成下一个排列算法/ ...

  6. hdu 3535 AreYouBusy

    // 混合背包// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,/ ...

  7. AWK print学习

    Awk是一种处理结构数据并输出格式化结果的编程语言, Awk 是其作者 "Aho,Weinberger,Kernighan" 的简称. Awk通常被用来进行格式扫描和处理.通过扫描 ...

  8. Oracle 隔离级别

    From 11gR2: http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/consist.htm#CNCPT621 一. A ...

  9. Partitioning by Palindromes

    题意: 给定一个字符串,求能分成最小几个回文串 分析:简单dp dp[i]前i个字符能分成的最小数量 dp[i]=min(dp[i],dp[j-1]+1) (j-i 是回文串) #include &l ...

  10. HDU 4336-Card Collector(状压,概率dp)

    题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来 ...