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. Python 初始—(迭代器和生成器)

    生成器也是一个迭代器,通过next()函数实现按需计算下一个数据列表生成器,使代码变得更加简洁,只记录当前的位置,只有__next__(), (i*2 for i in range(10)) 生成器( ...

  2. 图的m着色

    图的m着色 #include <bits/stdc++.h> using namespace std; int n, k, m, ans; struct node{ int m, colo ...

  3. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  4. Oracle客户端安装配置

    Oracle客户端安装配置.绿色版Oracle客户端配置使用PLSQL 安装Oracle客户端 准备工作,首先下载对应Oracle版本的客户端,这个可以去Oracle官网下载,加压完目录如下: 点击s ...

  5. 交换机基础配置之结合以太通道的vlan设置

    我们将以上面的拓扑图来做实验,建立以太通道,并设置好vlan,将pc1和pc3放在同一vlan,将pc2和pc4放在同一vlan,同一vlan能跨交换机通信 在一切还没布置之前,四台pc机都在同一网段 ...

  6. PHP实现的一个时间帮助类

    背景 工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率 主要功能 根据相差的天数获取连续的时间段 /** * 根据相差的天数获取所有连续的时间段 * @param $ ...

  7. java-访问控制修饰符

    访问权限 public    任何情况都可以访问 默认包 本包范围内可以访问到 protect       同一个包里的所有类所可以访问:所有子类(子类可以不和父类在同一个包)都可以访问 privat ...

  8. [CodeForces950C]Zebras

    Description 题目地址: Codeforces 题意:给你一串只含01的字符串,判断能否将字符串分为k个子序列,使得子序列满足以下条件: 开头和结尾都是0 相邻的2个数是01或者10 如0, ...

  9. 零基础~仿qq登录界面

    html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  10. 设置默认以管理员运行的WinForm

    右键工程名, 属性; 选择"安全性"; 勾选"启用ClickOnce安全设置"与"这是完全可信的应用程序"; 退出该页面, app.mani ...