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

题目大意:n头牛,按编号1~n从左往右排列,可以多头牛站在同一个点,给出ml行条件,每行三个数a b c表示dis[b]-dis[a]<=c,接下来有md行条件,每行三个数a b c,表示dis[b]-dis[a]>=c。求出出第一头牛和第n头牛的最大可能距离。若不可能把所有牛排成一排即条件有矛盾,则输出“-1”,若第一头牛和第n头牛的距离可以无限大,则输出“-2”。

解题思路:第二道差分约束的题目。根据题目给出的三个约束条件:

     ①dis[B]-dis[A]<=C

     ②dis[B]-dis[A]>=C → dis[A]-dis[B]<=-C

     ③dis[A]-dis[B]<=0

建图,然后同样的,因为要使距离尽可能大,所以if(dis[i]-dis[k]>cost[k][i])   dis[i]=dis[k]+cost[k][i]。

当出现负环,则说明该图矛盾,输出“-1”,当dis[n]==INF说明1和n之间距离可以无穷大,输出“-2”,其他时候输出dis[n]-dis[1]。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. const int N=1e3+;
  8. const int INF=0x3f3f3f3f;
  9. const int MAXN=3e4+;
  10.  
  11. struct node{
  12. int to,w,next;
  13. }edge[MAXN];
  14.  
  15. int n,idx;
  16. int head[N],dis[N],qcnt[N];
  17. bool vis[N];
  18.  
  19. void init(){
  20. idx=;
  21. memset(head,-,sizeof(head));
  22. }
  23.  
  24. void addedge(int u,int v,int w){
  25. edge[idx].w=w;
  26. edge[idx].to=v;
  27. edge[idx].next=head[u];
  28. head[u]=idx;
  29. idx++;
  30. }
  31.  
  32. bool spfa(int s) {
  33. memset(dis,0x3f,sizeof(dis));
  34. dis[s]=;
  35. queue<int>q;
  36. q.push(s);
  37. while(!q.empty()){
  38. int k=q.front();
  39. q.pop();
  40. vis[k]=false;
  41. for(int i=head[k];i!=-;i=edge[i].next){
  42. node t=edge[i];
  43. if(dis[k]+t.w<dis[t.to]){
  44. dis[t.to]=dis[k]+t.w;
  45. if(!vis[t.to]){
  46. q.push(t.to);
  47. qcnt[t.to]++;
  48. if(qcnt[t.to]>=n)
  49. return false;
  50. vis[t.to]=true;
  51. }
  52. }
  53. }
  54. }
  55. return true;
  56. }
  57.  
  58. int main(){
  59. init();
  60. int ml,md;
  61. scanf("%d%d%d",&n,&ml,&md);
  62. int a,b,c;
  63. for(int i=;i<=ml;i++){
  64. scanf("%d%d%d",&a,&b,&c);
  65. addedge(a,b,c); //b-a<=c
  66. }
  67. for(int i=;i<=md;i++){
  68. scanf("%d%d%d",&a,&b,&c);
  69. addedge(b,a,-c); //b-a>=c → a-b<=-c都改成小于的形式
  70. }
  71. for(int i=;i<=n-;i++){
  72. addedge(i+,i,); //默认的dis[i+1]-dis[i]>=0
  73. }
  74. if(!spfa())
  75. puts("-1");
  76. else if(dis[n]==INF)
  77. puts("-2");
  78. else
  79. printf("%d\n",dis[n]-dis[]);
  80. return ;
  81. }

     

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

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

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

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

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

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

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

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

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

  5. poj 3169 Layout (差分约束)

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

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

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

  7. poj 3169 Layout(差分约束)

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

  8. POJ 3167 Layout(差分约束)

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

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

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

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

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

随机推荐

  1. 【JavaScript】基本类型和引用类型的值、引用类型

    一.前言        接着上一篇继续记笔记 二.内容         动态的属性 var person = new Object(); person.name = "Nicholas&qu ...

  2. 【BZOJ3243】【NOI2013】向量内积(矩阵,数论)

    [BZOJ3243][NOI2013]向量内积(矩阵,数论) 题面 BZOJ 题解 这题好神仙. 首先\(60\)分直接是送的.加点随机之类的可以多得点分. 考虑正解. 我们先考虑一下暴力. 我们把\ ...

  3. 数字表格(product)

    Portal -->broken qwq Description ​  求\(\prod\limits_{i=1}^n\prod\limits_{j=1}^m f[gcd(i,j)](mod\ ...

  4. 高性能相关、Scrapy框架

    高性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...

  5. Python new() 方法

    什么是new方法 __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法. __new__()是在新式类中 ...

  6. Android之框架20160721

    Android的四层架构分别为:Linux2.6内核层,核心库层,应用框架层,应用层. 其中Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我 ...

  7. bzoj3938 Robot

    3938: Robot Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 336  Solved: 112[Submit][Status][Discuss ...

  8. C++编译报错:重复定义

    http://note.youdao.com/noteshare?id=cb2bed862a2daae89775603168f297af

  9. ASP.NET 使用ajaxupload.js插件出现上传较大文件失败的解决方法

    在网上下载了一个ajaxupload.js插件,用于无刷新上传图片使的,然后就按照demo的例子去运行了一下,上传啊什么的都OK,但是正好上传的示例图片有一个比较大的,4M,5M的样子,然后上传就会报 ...

  10. myeclipse注册码,可以用到2016年

    myeclipse注册码,可以用到2016年 xiangyang kLR8ZF-655954-61677756068297221