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. WebAppBuilder独立于Portal之arcgis for js应用框架研究

    1.前言 最近在做项目过程中,用到了WAB,先做一下总结和归类.Webappbuilder(简称WAB)是运行在portal或者online的一款webGIS开发应用程序,其代码开源并且具有优秀的设计 ...

  2. linux中安装JDK linux中安装Tomcat linux中安装Mysql 及故障解析 linux系统安装redis

    Linux 安装JDK 配置完环境变量后无法使用 java -version 无法打开 通过下面语句 将32位文件与当前系统64位兼容 (有待补充32位查法)sudo yum install glib ...

  3. Java删除文件或目录及目录下所有文件

    一直在做C++相关开发的工作.突然某一天一时兴起,想学习下Java开发.然后再网上找到一本Java简明教程,入门是够用了.看到文件IO这一章,想起之前用C++做的删除文件或目录的练习,于是打算用Jav ...

  4. DFS练习-HDU1010

    题目来源:HDU1010 DFS的基本原则已经差不多了,但是一些技巧仍然比较难想,所以还是加强练习,然后总结一下. 还是先看题意 ,指定迷宫的长,宽以及走出迷宫的具体时间N,M,T. 其中(1 < ...

  5. 【jQuery】阶段(插入、复制、替换、删除)

    <p>你好!</p> 你最喜欢的水果是? <ul> <li title="苹果">苹果</li> <li titl ...

  6. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  7. 《Python语言及其应用》学习笔记

    第二章 ========== 对象的类型决定了可以对它进行的操作.对象的类型还决定了它装着的数据是允许被修改的变量(可变的),还是不可被修改的常量(不可变的). Python是强类型的,你永远无法修改 ...

  8. linuxC编程介绍

    第一步:写完程序 /first.c/ #include <stdio.h> int main() { printf("hello,welcome to the LinuxC!\n ...

  9. Pandas 数据读取

    1.读取table # 读取普通分隔数据:read_table # 可以读取txt,csv import os os.chdir('F:/') #首先设置一下读取的路径 data1 = pd.read ...

  10. Postgres主备切换

    主备查询 主备不会自动切换(即需要实现线上环境主数据库宕掉之后,从数据库能够自动切换为主数据库,需要借用第三方软件,例如heartbeat等) (1)如何查看是primary还是standby 方法1 ...