Schedule Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1085    Accepted Submission(s): 448
Special Judge

Problem Description
A project can be divided into several parts. Each part should be completed continuously. This means if a part should take 3 days, we should use a continuous 3 days do complete it. There are four types of constrains among these parts which are FAS, FAF, SAF and SAS. A constrain between parts is FAS if the first one should finish after the second one started. FAF is finish after finish. SAF is start after finish, and SAS is start after start. Assume there are enough people involved in the projects, which means we can do any number of parts concurrently. You are to write a program to give a schedule of a given project, which has the shortest time.
 
Input
The input file consists a sequences of projects.

Each project consists the following lines:

the count number of parts (one line) (0 for end of input)

times should be taken to complete these parts, each time occupies one line

a list of FAS, FAF, SAF or SAS and two part number indicates a constrain of the two parts

a line only contains a '#' indicates the end of a project

 
Output
Output should be a list of lines, each line includes a part number and the time it should start. Time should be a non-negative integer, and the start time of first part should be 0. If there is no answer for the problem, you should give a non-line output containing "impossible".

A blank line should appear following the output for each project.

 
Sample Input
3
2
3
4
SAF 2 1
FAF 3 2
#
3
1
1
1
SAF 2 1
SAF 3 2
SAF 1 3
#
0
 
Sample Output
Case 1:
1 0
2 2
3 1

Case 2:
impossible

 
Source
 
Recommend
LL   |   We have carefully selected several similar problems for you:  1529 1384 1531 3592 3666 
 
 //0MS    248K    1537 B    G++
/* 题意:
给出完成作业需要的时间,以及它们间完成的先后关系,问是否可行,可行输出每个作业的开始时间 差分约束: 有n个作业,第 i 个作业所需的时间是 a[i]; SAS u v 表示 v开始后 u 才能开始;f(u)>=f(v); SAF u v 表示 v结束后 u 才能开始;f(u)+a[u]>=f(v); FAF u v 表示 v结束后 u 才能结束;f(u)+a[u]>=f(v)+a[v]; FAS u v 表示 v开始后 u 才能结束;f(u)>=f(v)+a[v] 这里使用bellman_ford算法,建立反向边,求最长路径 */
#include<stdio.h>
#include<string.h>
#define N 1005
#define inf 0x7ffffff
struct node{
int u,v,w;
}edge[*N];
int d[N];
int a[N];
int n,edgenum;
bool bellman_ford()
{
memset(d,,sizeof(d));
bool flag=true;
for(int i=;i<=n;i++){
if(!flag) break;
flag=false;
for(int j=;j<edgenum;j++){
if(d[edge[j].v]<d[edge[j].u]+edge[j].w){
d[edge[j].v]=d[edge[j].u]+edge[j].w;
flag=true;
}
}
}
return flag; //如果执行n次后还能松弛证明有正权环
}
int main(void)
{
char opr[];
int x,y;
int k=;
while(scanf("%d",&n),n)
{
edgenum=;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
while(scanf("%s",opr)){
if(strcmp(opr,"#")==) break;
scanf("%d%d",&x,&y);
edge[edgenum].u=y;
edge[edgenum].v=x;
if(strcmp(opr,"SAS")==){
edge[edgenum].w=;
}
if(strcmp(opr,"SAF")==){
edge[edgenum].w=a[y];
}
if(strcmp(opr,"FAS")==){
edge[edgenum].w=-a[x];
}
if(strcmp(opr,"FAF")==){
edge[edgenum].w=a[y]-a[x];
}
edgenum++;
}
printf("Case %d:\n",k++);
if(bellman_ford()) puts("impossible");
else{
for(int i=;i<=n;i++)
printf("%d %d\n",i,d[i]);
}
printf("\n");
}
return ;
}

再贴一个SPFA的:

 //218MS    456K    1791 B    G++
#include<iostream>
#include<vector>
#include<queue>
#define N 1005
#define inf 0x7ffffff
using namespace std;
struct node{
int v,w;
node(int a,int b){
v=a;w=b;
}
};
vector<node>V[N];
int a[N];
int d[N],in[N],vis[N];
int n;
bool spfa()
{
memset(in,,sizeof(in));
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) d[i]=-inf;
queue<int>Q;
Q.push();
vis[]=;
in[]=;
d[]=;
while(!Q.empty()){
int u=Q.front();
Q.pop();
if(in[u]>n) return false;
vis[u]=;
int n0=V[u].size();
for(int i=;i<n0;i++){
int v=V[u][i].v;
int w=V[u][i].w;
if(d[v]<d[u]+w){
d[v]=d[u]+w;
if(!vis[v]){
in[v]++;
Q.push(v);
vis[v]=;
}
}
}
}
return true;
}
int main(void)
{
string opr;
int x,y;
int k=;
while(cin>>n)
{
if(!n) break;
for(int i=;i<=n;i++) V[i].clear();
for(int i=;i<=n;i++){
cin>>a[i];
V[].push_back(node(i,));
}
while(cin>>opr){
if(opr=="#") break;
cin>>x>>y;
if(opr=="SAS") V[y].push_back(node(x,));
if(opr=="SAF") V[y].push_back(node(x,a[y]));
if(opr=="FAS") V[y].push_back(node(x,-a[x]));
if(opr=="FAF") V[y].push_back(node(x,a[y]-a[x]));
}
cout<<"Case "<<k++<<":"<<endl;
if(!spfa()) cout<<"impossible"<<endl;
else{
for(int i=;i<=n;i++)
cout<<i<<" "<<d[i]<<endl;
}
cout<<endl;
}
return ;
}

hdu 1534 Schedule Problem (差分约束)的更多相关文章

  1. HDOJ 1534 Schedule Problem 差分约束

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

  2. HDU 3666 THE MATRIX PROBLEM (差分约束)

    题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...

  3. hdu 1531 king(差分约束)

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

  4. HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  5. HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  6. hdu 1384 Intervals (差分约束)

    Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...

  7. hduTHE MATRIX PROBLEM(差分约束)

    题目请戳这里 题目大意:给一个n*m的矩阵,求是否存在这样两个序列:a1,a2...an,b1,b2,...,bm,使得矩阵的第i行乘以ai,第j列除以bj后,矩阵的每一个数都在L和U之间. 题目分析 ...

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

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

  9. ZOJ 1455 Schedule Problem(差分约束系统)

    // 题目描述:一个项目被分成几个部分,每部分必须在连续的天数完成.也就是说,如果某部分需要3天才能完成,则必须花费连续的3天来完成它.对项目的这些部分工作中,有4种类型的约束:FAS, FAF, S ...

随机推荐

  1. base64位 解码图片

    jar包是commons-codec.jar. pnuts //base64解码成图片 function gldBase64ToImage(imgStr,imgFilePath) { // 对字节数组 ...

  2. (排班表二)后台动态绘制Grid表格

    后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...

  3. ElasticSearch High Level REST API【7】聚合

    获取平均值聚合示例,最大值.最小值.求和类似 public void aggregation(){ RestHighLevelClient client = elasticClient.getRest ...

  4. a链接打开另外的新页面

    在a标签添加target = "_blank" 属性即可

  5. linux系统批量创建用户和生成8位随机密码

    1.1    脚本案例 批量创建20个用户,用户名为user1-user20,并生成8位随机登录密码,用户组采用键盘输入的方式,并将用户名及登录密码保存到/tmp/create_user.txt普通文 ...

  6. Java高并发之同步异步

    1.概念理解: 2.同步的解决方案: 1).基于代码 synchronized 关键字 修饰普通方法:作用于当前实例加锁,进入同步代码前要获得当前实例的锁. 修饰静态方法:作用于当前类对象加锁,进入同 ...

  7. Windows Server 2008 IIS 并发请求设置

    更新服务器的时候,突然发现部分机器出现了错误,大致描述如下 HTTP Error 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurren ...

  8. 关于PHPExcel 基础使用方法

    $dir=dirname(__FILE__);//找到当前脚本所在路径require_once $dir.'/PHPExcel/PHPExcel.php';$objPHPExcel=new PHPEx ...

  9. 关于sql server 2008 r2 展开时报错:参数名:viewInfo ( Microsoft SqlServer Management SqlStudio Explorer )解决思路

    今天安装了sql server 2008 R2,安装成功之后我打开软件登陆都没问题,但是一展开选项就弹出错误提示框: 参数名:viewInfo 不能为空 (Microsoft SqlServer Ma ...

  10. P2158 [SDOI2008] (欧拉函数

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...