题意:

  有n个人在排队,按照前后顺序编号为1~n,现在对其中某两人的距离进行约束,有上限和下限,表示dis[a,b]<=c或者dis[a,b]>=c,问第1个人与第n个人的距离最多可能为多少?(若INF则输出-2,若冲突则输出-1,否则输出距离)

思路:

  建图时都将约束转成a-b<=c的标准形式,然后建一条b->a的边,权为c。然后求最短路,注意最短路跑出来的结果却是最远的合法距离,而不是最短距离。本题无需添加辅助边,只要到达不了n,则距离为INF,输出-2,若有负环,那肯定是冲突了,为-1。

  1. //#include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <set>
  7. #include <deque>
  8. #include <map>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #define pii pair<int,int>
  13. #define back que[rear-1]
  14. #define INF 0x3f3f3f3f
  15. #define LL long long
  16. #define ULL unsigned long long
  17. using namespace std;
  18. const double PI = acos(-1.0);
  19. const int N=;
  20. struct node
  21. {
  22. int from,to,dis,next;
  23. node(){};
  24. node(int from,int to,int dis,int next):from(from),to(to),dis(dis),next(next){};
  25. }edge[N*N];
  26.  
  27. int edge_cnt, head[N];
  28. int inq[N], cnt[N], dist[N], n;
  29.  
  30. void add_node(int from,int to,int dis)
  31. {
  32. edge[edge_cnt]=node(from,to,dis,head[from]);
  33. head[from]=edge_cnt++;
  34. }
  35.  
  36. int spfa(int st,int ed)
  37. {
  38. memset(cnt,,sizeof(cnt));//入队次数
  39. memset(inq,,sizeof(inq));//是否在队中
  40. memset(dist,0x3f,sizeof(dist));//距离
  41. deque<int> que(,st);
  42. inq[st]=;
  43. dist[st]=;
  44. while(!que.empty())
  45. {
  46. int t=que.front();que.pop_front();
  47. inq[t]=;node e;
  48. for(int i=head[t]; i!=-; i=e.next)
  49. {
  50. e=edge[i];
  51. if( dist[e.to]>dist[t]+e.dis )
  52. {
  53. dist[e.to]=dist[t]+e.dis;
  54. if(!inq[e.to]) //没有在队列中
  55. {
  56. if(++cnt[e.to]>n) //入队次数过多
  57. return -;
  58. inq[e.to]=;//下面是优化,可删
  59. if(!que.empty() && dist[e.to]<dist[que.front()])
  60. que.push_front(e.to);
  61. else que.push_back(e.to);
  62. }
  63. }
  64.  
  65. }
  66. }
  67. return dist[ed]==INF?-:dist[ed];
  68. }
  69.  
  70. void init()
  71. {
  72. edge_cnt=;
  73. //for(int i=0; i<=n; i++) head[i]=-1;
  74. memset(head,-,sizeof(head));
  75. }
  76.  
  77. int main()
  78. {
  79. freopen("input.txt", "r", stdin);
  80. int x, y, a, b, c, t;cin>>t;
  81. while(t--)
  82. {
  83. init();
  84. scanf("%d%d%d",&n,&x,&y);
  85. for(int i=; i<=x; i++) //最多
  86. {
  87. scanf("%d%d%d",&a,&b,&c);
  88. add_node(a,b,c);
  89. }
  90. for(int i=; i<=y; i++) //最小
  91. {
  92. scanf("%d%d%d",&a,&b,&c);
  93. add_node(b,a,-c);
  94. }
  95. printf("%d\n", spfa(,n));
  96. }
  97. return ;
  98. }

AC代码

HDU 3592 World Exhibition (差分约束,spfa,水)的更多相关文章

  1. HDU 1384 Intervals【差分约束-SPFA】

    类型:给出一些形如a−b<=k的不等式(或a−b>=k或a−b<k或a−b>k等),问是否有解[是否有负环]或求差的极值[最短/长路径].例子:b−a<=k1,c−b&l ...

  2. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

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

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

  4. POJ 1364 / HDU 3666 【差分约束-SPFA】

    POJ 1364 题解:最短路式子:d[v]<=d[u]+w 式子1:sum[a+b+1]−sum[a]>c      —      sum[a]<=sum[a+b+1]−c−1  ...

  5. 图论分支-差分约束-SPFA系统

    据说差分约束有很多种,但是我学过的只有SPFA求差分: 我们知道,例如 A-B<=C,那么这就是一个差分约束. 比如说,著名的三角形差分约束,这个大家都是知道的,什么两边之差小于第三边啦,等等等 ...

  6. 【HDOJ1529】【差分约束+SPFA+二分】

    http://acm.hdu.edu.cn/showproblem.php?pid=1529 Cashier Employment Time Limit: 2000/1000 MS (Java/Oth ...

  7. 【HDOJ1384】【差分约束+SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=1384 Intervals Time Limit: 10000/5000 MS (Java/Others)     ...

  8. hdu 1531 king(差分约束)

    King Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. hdu 1534 Schedule Problem (差分约束)

    Schedule Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

随机推荐

  1. There&nbsp;is&nbsp;no&nbsp;resul…

    There is no result type defined for type 'json' mapped with name 'success'. 这个错误是json初学者很容易遇到的错误:现在把 ...

  2. FZU2056 最大正方形(二分答案)

    Problem 2056 最大正方形 Accept: 171    Submit: 516Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  3. 过滤asp.net页面每次发出请求之前访问

    public class PageFiltert : System.Web.UI.Page { public PageFiltert() { // //TODO: 在此处添加构造函数逻辑 // } p ...

  4. Vue拖拽组件列表实现动态页面配置

    需求描述 最近在做一个后台系统,有一个功能产品需求是页面分为左右两部分,通过右边的组件列表来动态配置左边的页面视图,并且左边由组件拼装起来的视图,可以实现上下拖拽改变顺序,也可以删除. 根据这个需求我 ...

  5. IT兄弟连 Java语法教程 Java平台的版本划分

    自从Sun公司推出Java以来,就力图使之无所不能.Java发展至今,按应用范围划分为3个版本,即Java SE.Java EE和Java ME,也就是SunOne(Open Net Environm ...

  6. SpringMVC入门 bug集锦X2

    package cn.itcast.converter; import org.springframework.core.convert.converter.Converter; import jav ...

  7. urllib2基础操作

    Urllib2基础操作 1.打开网页(urlopen) 打开一个网页 import urllib2 response = urllib2.urlopen('http://www.baidu.com') ...

  8. 优化MyEclipse编译速度慢的问题

    转载大神的 https://www.cnblogs.com/luxd/p/5999217.html

  9. redis安装&启动

    1.下载:redis.io,我下载的是5.0. 2.安装 1).tar -zxvf redis-5.0.0 2).进入src目录,执行make 3.回退到src的上一级目录,编辑redis.conf ...

  10. NSwag生成客户端调用代码

    NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码 https://www.cnblogs.com/hunanzp/p/9297361.html 前言 上一篇博客中我们 ...