UVALive - 4885 Task 差分约束
Task
题目连接:
Description
In most recipes, certain tasks have to be done before others. For each task, if we are given a list of
other tasks that it depends on, then it is relatively straightforward to come up with a schedule of tasks
that satisfies the dependencies and produces a stunning dish. Many of us know that this can be solved
by some algorithm called toplogical sort.
But life is not so easy sometimes. For example, here is a recipe for making pizza dough:
- Mix the yeast with warm water, wait for 5 to 10 minutes.
- Mix the the remaining ingredients 7 to 9 minutes.
- Mix the yeast and the remaining ingredients together for 10 to 15 minutes.
- Wait 90 to 120 minutes for the dough to rise.
- Punch the dough and let it rest for 10 to 15 minutes.
- Roll the dough.
In this case, tasks 1 and 2 may be scheduled after the first minute (we always spend the first minute
to read the recipe and come up with a plan). The earliest task 3 may be started is at 8 minutes, and
task 4 may start at 18 minutes after the start, and so on. This recipe is relatively simple, but if some
tasks have many dependent tasks then scheduling can become unmanageable. Sometimes, the recipe
may in fact be impossible to execute.
For example, consider the following abstract recipe: - task 1
- after task 1 but within 2 minutes of it, do task 2
- at least 3 minutes after task 2 but within 2 minutes of task 1, do task 3
In this problem, you are given a number of tasks. Some tasks are related to another based on their
starting times. You are asked to assign a starting time to each task to satisfy all constraints if possible,
or report that no valid schedule is possible.
Input
The input consists of a number of cases. The first line of each case gives the number of tasks n
(1 ≤ n ≤ 100). This is followed by a line containing a non-negative integer m giving the number of
constraints. Each of the next m lines specify a constraint. The two possible forms of constraints are:
task i starts at least A minutes later than task j
task i starts within A minutes of the starting time of task j
where i and j are the task numbers of two different tasks (1 ≤ i, j ≤ n), and A is a non-negative integer
(A ≤ 150). The first form states that task i must start at least A minutes later than the start time of
task j. The second form states that task i must start no earlier than task j, and within A minutes of
the starting time of task j. There may be multiple constraints involving the same pair of tasks.
Note that at least and within include the end points (i.e. if task 1 starts at 1 minute and task 2
starts at 4 minutes, then task 2 starts at least 3 minutes later than task 1, and within 3 minutes of the
starting time of task 1).
The input is terminated by n = 0.
Output
For each case, output a single line containing the starting times of task 1 through task n separated by a
single space. Each starting time should specify the minute at which the task starts. The starting time
of each task should be positive and less than 1000000. There may be many possible schedules, and any
valid schedule will be accepted. If no valid schedule is possible, print ‘Impossible.’ on a line instead.
Sample Input
6
10
task 3 starts at least 5 minutes later than task 1
task 3 starts within 10 minutes of the starting time of task 1
task 3 starts at least 7 minutes later than task 2
task 3 starts within 9 minutes of the starting time of task 2
task 4 starts at least 10 minutes later than task 3
task 4 starts within 15 minutes of the starting time of task 3
task 5 starts at least 90 minutes later than task 4
task 5 starts within 120 minutes of the starting time of task 4
task 6 starts at least 10 minutes later than task 5
task 6 starts within 15 minutes of the starting time of task 5
3
4
task 2 starts at least 0 minutes later than task 1
task 2 starts within 2 minutes of the starting time of task 1
task 3 starts at least 3 minutes later than task 2
task 3 starts within 2 minutes of the starting time of task 1
0
Sample Output
3 1 8 18 108 118
Impossible.
Hint
题意
给你n个变量,然后m组描述:
每组描述A,B,C,
要么是A比B至少大C
要么是A超过B最多C
然后输出一组合法解。
题解:
拆开看,描述其实是:
A-B>=C
B-A>=-C,A-B>=0
根据这个描述建立差分约束,没有负环即有解。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
vector<int> E1[maxn];
vector<int> V1[maxn];
int vis[maxn];
int n,m,d[maxn];
int spfa(int x){
queue<int> Q;
Q.push(x);
d[x]=0;
vis[x]=1;
int T = 0;
while(!Q.empty()){
x=Q.front();
Q.pop();
T++;
if(T>10000)return 0;
for(int i=0;i<E1[x].size();i++){
int v=E1[x][i];
if(d[v]>d[x]+V1[x][i]){
d[v]=d[x]+V1[x][i];
vis[v]=1;
Q.push(v);
}
}
}
return 1;
}
int main(){
while(scanf("%d",&n)!=EOF){
if(n==0)break;
memset(vis,0,sizeof(vis));
scanf("%d",&m);
for(int i=0;i<maxn;i++)
E1[i].clear(),V1[i].clear();
for(int i=0;i<m;i++){
int A,B,C;
string s1;
//task i starts at least A minutes later than task j
//task i starts within A minutes of the starting time of task j
cin>>s1;
scanf("%d",&A);
cin>>s1;
string s;
cin>>s;
if(s[0]=='a'){
cin>>s1;
scanf("%d",&B);
for(int i=0;i<4;i++)
cin>>s1;
scanf("%d",&C);
E1[A].push_back(C);
V1[A].push_back(-B);
E1[A].push_back(C);
V1[A].push_back(0);
}else{
scanf("%d",&B);
for(int i=0;i<7;i++)
cin>>s1;
scanf("%d",&C);
E1[C].push_back(A);
V1[C].push_back(B);
E1[A].push_back(C);
V1[A].push_back(0);
}
}
for(int i=0;i<maxn;i++)
d[i]=1e9;
int flag=1;
for(int i=1;i<=n;i++){
if(!vis[i]){
if(spfa(i)==0){
flag=0;
break;
}
}
}
if(flag==0){
printf("Impossible.\n");
continue;
}
for(int i=1;i<=n;i++){
if(i==1)printf("%d",d[i]+1);
else printf(" %d",d[i]+1);
}
printf("\n");
}
}
UVALive - 4885 Task 差分约束的更多相关文章
- 【差分约束系统】【spfa】UVALive - 4885 - Task
差分约束系统讲解看这里:http://blog.csdn.net/xuezhongfenfei/article/details/8685313 模板题,不多说.要注意的一点是!!!对于带有within ...
- UVALive 5532 King(差分约束,spfa)
题意:假设一个序列S有n个元素,现在有一堆约束,限制在某些连续子序列之和上,分别有符号>和<.问序列S是否存在?(看题意都看了半小时了!) 注意所给的形式是(a,b,c,d),表示:区间之 ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
- Is the Information Reliable?(差分约束)
Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years a ...
- Candies-POJ3159差分约束
Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- ZOJ 2770火烧连营——差分约束
偶尔做了一下差分约束. 题目大意:给出n个军营,每个军营最多有ci个士兵,且[ai,bi]之间至少有ki个士兵,问最少有多少士兵. ---------------------------------- ...
- POJ 2983 Is the Information Reliable? 差分约束
裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...
- 2014 Super Training #6 B Launching the Spacecraft --差分约束
原题:ZOJ 3668 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668 典型差分约束题. 将sum[0] ~ sum ...
随机推荐
- 微信小程序API 登录-wx.login(OBJECT) + 获取微信用户唯一标识openid | 小程序
wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要 ...
- SQL Server 常用函数使用方法
之前就想要把一些 SQL 的常用函数记录下来, 直到今天用到substring()这个函数,C# 里面这个方法起始值是 0,而 SQL 里面起始值是 1.傻傻分不清楚... 这篇博客作为记录 SQL ...
- Visual Studio 2017 IDE之xml过大报错
XML处理时遇到这个错误 在powershell中输入 $vsWherePath = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual ...
- ElasticSearch搜索解析
这篇介绍稍多,篇幅可能有点多,下面会针对一些重要的点做一些小测试 搜索返回文档解析 hits搜索返回的结果中最重要的一部分其中包含了 索引信息(_index,_type,_index,_source, ...
- 解决redis aof文件过大的问题
执行BGREWRITEAOF命令对redis的AOF进行重写 redis-cli BGREWRITEAOF 相关解释: Redis的AOF机制有点类似于Mysql binlog,是Redis的提供的一 ...
- request.user哪里来的?
1.登录认证(auth认证登录后login后设置了session等信息包含用户的pk) >>>>> 2.用户再次请求登录的时候,通过 ...
- java大数相加
import java.math.BigInteger; import java.util.Scanner; public class Bignum{ public static void ma ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- pyqt pyside QAction 代码中触发
pyqt pyside QAction 代码中触发 一般如果多个QAction(在同一个 QButtonGroup 中,而且是 checkable 的),不同情况下我们希望其中某个默认checked: ...
- ES6+javaScript原型
Symbol 属性私有化,数据保护 let _gender = Symbol('gender') function Person(name, gender) { this.name = name; t ...