题意:有n个任务,给出完成n个任务所需时间,以及一些任务安排。任务安排有四种:

FAS a b:任务a需在任务b开始后完成。

FAF a b:任务a需在任务b完成后完成。

SAF a b:任务a需在任务b完成后开始。

SAS a b:任务a需在任务b开始后开始。

求在这些任务安排下各个任务的最早开始时间,若任务安排为不可能安排则输出impossible。每组数据结束需要输出一个空行。

思路:四种任务安排可以得到四种不等式如下:(dis[]表示任务开始时间,x[]表示任务完成所需时间)

FAS a b:dis[a]+x[a]>=dis[b]

FAF a b:dis[a]+x[a]>=dis[b]+x[b]

SAF a b:dis[a]>=dis[b]+x[b]

SAS a b:dis[a]>=dis[b]

因为求任务开始的最早时间即最小值,加上此题有好多的不等式可以进行差分约束。所以建图,spfa()最长路即可求得答案。

终于看到一个比较不那么抽象的差分约束了

记得连上超级源点0

显然不可能有短路

当有环的时候没有答案!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input by bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);--i)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m)
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define REP(i,N) for(int i=0;i<(N);i++)
  12. #define CLR(A,v) memset(A,v,sizeof A)
  13. //////////////////////////////////
  14. #define inf 0x3f3f3f3f
  15. #define INF 0x3f3f3f3f
  16. #define N 100000
  17. int head[N];
  18. int pos;
  19. struct node
  20. {
  21. int to,v,nex;
  22. }edge[];
  23. void add(int a,int b,int c)
  24. {
  25. edge[++pos].nex=head[a];
  26. head[a]=pos;
  27. edge[pos].v=c;
  28. edge[pos].to=b;
  29. }
  30. int n;
  31.  
  32. int vis[N],dis[N],cnt[N];
  33. bool spfa()
  34. {
  35. rep(i,,n)
  36. vis[i]=,dis[i]=-inf,cnt[i]=;
  37. dis[]=;
  38. vis[]=;
  39. cnt[]++;
  40. queue<int>q;
  41. q.push();
  42. while(!q.empty())
  43. {
  44. int u=q.front();q.pop();
  45. vis[u]=;
  46. for(int i=head[u];i;i=edge[i].nex)
  47. {
  48. int v=edge[i].to;
  49. if(dis[v]<dis[u]+edge[i].v)
  50. {
  51. dis[v]=dis[u]+edge[i].v;
  52. if(!vis[v])
  53. {
  54. if(++cnt[v]>n)return ;
  55. vis[v]=;
  56. q.push(v);
  57. }
  58. }
  59. }
  60. }
  61. return ;
  62. }
  63. int t[N];
  64. int main()
  65. {
  66. int cas=;
  67. while(RI(n),n)
  68. {
  69. printf("Case %d:\n",++cas);
  70. CLR(head,);
  71. pos=;
  72. rep(i,,n)RI(t[i]);
  73.  
  74. int a,b;
  75. char s[];
  76. while()
  77. {
  78. RS(s);
  79. if(s[]=='#')break;
  80. RII(a,b);
  81. if(s[]=='F')
  82. {
  83. if(s[]=='S')
  84. add(b,a,-t[a]);
  85. else
  86. add(b,a,t[b]-t[a]);
  87. }
  88. else
  89. {
  90. if(s[]=='F')
  91. add(b,a,t[b]);
  92. else
  93. add(b,a,);
  94. }
  95. }
  96. rep(i,,n)
  97. add(,i,);
  98.  
  99. if(spfa())
  100. {
  101. rep(i,,n)
  102. printf("%d %d\n",i,dis[i]);
  103. }
  104. else
  105. printf("impossible\n");
  106. cout<<endl;
  107. }
  108. return ;
  109. }

Schedule Problem spfa 差分约束的更多相关文章

  1. hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. Candies---hdu3159(spfa+差分约束)

    题目链接:http://poj.org/problem?id=3159 题意:有n个小孩,m个关系格式是A B C 表示小孩 B 的糖果数最多比小孩A多C个,相当于B-A<=C; 有m个这样的关 ...

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

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

  4. HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

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

    题目链接:http://poj.org/problem?id=3169 题目大意:n头牛,按编号1~n从左往右排列,可以多头牛站在同一个点,给出ml行条件,每行三个数a b c表示dis[b]-dis ...

  6. codevs 1183 泥泞的道路 (二分+SPFA+差分约束)

    /* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简 ...

  7. HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)

    题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...

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

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

  9. HDOJ 1534 Schedule Problem 差分约束

    差分约数: 求满足不等式条件的尽量小的值---->求最长路---->a-b>=c----> b->a (c) Schedule Problem Time Limit: 2 ...

随机推荐

  1. google搜索指南

    常用搜索技巧 搜索社交媒体@ @twitter 搜索特定价格$ $400 搜素标签# #tag 排除特定词,在词前加减号- -except 搜索完全匹配词,加双引号"" " ...

  2. ArcGis Python脚本——遍历输出面或折线要素的折点坐标

    有示例要素类如下 经过下面代码处理 #遍历输出面或折线要素的折点坐标 #infc:输入要素类 # code source: https://www.cnblogs.com/yzhyingcool/# ...

  3. nginx资料汇总

    nginx docker 中的一些目录和 windows下是不同的, 静态内容目录: /usr/share/nginx/html 配置文件目录: /etc/nginx 日志输出目录: /var/log ...

  4. 六十一、linux 编程—— 守护进程

    61.1 介绍 守护进程(daemon)是生存期长的一种进程.它们常常在系统引导装入时启动,在系统关闭时终止 守护进程也称为后台进程 所有守护进程都以超级用户(用户 ID 为0)的优先权运行. 守护进 ...

  5. Optimal Marks SPOJ 839

    这题远超其他题非常靠近最小割的实际意义: 割边<=>付出代价<=>决定让两个点的值不相同,边权增加 最小割<=>点的值与s一个阵营的与s相同,与t一个阵营的与t相同 ...

  6. Java虚拟机运行时内存区域简析

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  7. centos配置epel和remi源

    来源:https://blog.csdn.net/zhang197093/article/details/52057898 CentOS 内置的yum命令安装非常的简单实用,能自动帮助我们解决依赖,但 ...

  8. 开发一个项目之ES2015+

    变量的解构赋值 任何部署了 Iterator 的对象都可 for of 循环(数组.Set.Map.某些类似数组的对象(arguments对象.DOM NodeList 对象).Generator 对 ...

  9. javascript基础 之 jQuery教程

    1,jQuery是js的一个库 基本功能: HTML元素获取和操作,html事件操作. css操作. js特效和动画 DOM遍历和修改 ajax Utilities 特性: js2以上的版本不支持ie ...

  10. Theano.tensor.round函数学习,同时解决输出Elemwise{xxx,no_inplace}.0的问题

    1. 出现Elemwise{xxx,no_inplace}.0   这是因为没有定义theano.function所致,参考下面错误示范: y = np.random.normal(size=(2,2 ...