Schedule Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1715    Accepted Submission(s): 757
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
 
题意:有n个项目,每个项目有一个周期,表示完成其的时间,然后下面有一些限制,SAF a b 表示 a 的开始时间要晚于 b的结束时间,FAF,SAS,FAS类似。问每个项目最早的开始时间,依下标输出.
题解:我们假设 a的周期是 v[a] ,开始时间是 s[a],结束时间是 e[a], b类似.
SAF 就可以表示为 s[a] - e[b]>=0 ---->s[a] - (s[b] +v[b] )>=0 这样的话就可以列出很多个关于起点的方程,然后就设立一个超级源点,和每个起点连条长度为 0 的边,从超级源点进行 spfa,得到 low数组后依次输出即可。有环则输出 impossible,今天听说spfa只要进入 sqrt(n) 次就可以判断有没有环了,这个题还真可以。。如果有题超时的话,不妨可以试试。。不过数据强的话另当别论。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = ;
const int N = ;
struct Edge{
int v,w,next;
}edge[];
int head[N];
int n,tot;
int val[N];
void init(){
memset(head,-,sizeof(head));
tot = ;
}
void addEdge(int u,int v,int w,int &k){
edge[k].v = v,edge[k].w = w,edge[k].next = head[u],head[u] = k++;
}
int low[N],time[N];
bool vis[N];
int spfa(int s){
for(int i=;i<=n;i++){
vis[i] = false;
low[i] = -INF;
time[i] = ;
}
low[s] = ;
time[s]++;
queue<int> q;
q.push(s);
int num = ((int)sqrt(n)+); ///改成根号 n 可以AC...
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int k=head[u];k!=-;k=edge[k].next){
int v = edge[k].v,w=edge[k].w;
if(low[v]<low[u]+w){
low[v] = low[u]+w;
if(!vis[v]){
vis[v] = true;
q.push(v);
if(time[v]++>num) return ;
}
}
}
}
return ;
}
int main(){
int t = ;
while(scanf("%d",&n)!=EOF,n){
init();
int MAX = -;
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
}
char str[];
int super = ;
while(scanf("%s",str)){
if(strcmp(str,"#")==) break;
int a,b;
scanf("%d%d",&a,&b);
if(strcmp(str,"SAF")==){
addEdge(b,a,val[b],tot);
}else if(strcmp(str,"FAF")==){
addEdge(b,a,-(val[a]-val[b]),tot);
}else if(strcmp(str,"FAS")==){
addEdge(b,a,-val[a],tot);
}else{
addEdge(b,a,,tot);
}
}
for(int i=;i<=n;i++){
addEdge(super,i,,tot);
}
printf("Case %d:\n",t++);
if(spfa(super)){
for(int i=;i<=n;i++){
printf("%d %d\n",i,low[i]);
}
}else{
printf("impossible\n");
}
printf("\n");
}
return ;
}

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

  1. hdu 1534(差分约束+spfa求最长路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...

  2. hdu 1531(差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...

  3. I - 动物狂想曲 HDU - 6252(差分约束)

    I - 动物狂想曲 HDU - 6252 雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起 ...

  4. hdu 4598 差分约束

    思路:首先就是判断是否有奇环,若存在奇环,则输出No. 然后用差分约束找是否符合条件. 对于e(i,j)属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]>=T--->v[j]-v ...

  5. hdu 3666(差分约束,手动栈解决超时问题)

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

  6. hdu 1364(差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12056   Accepted: 4397 Description ...

  7. hdu 3440 差分约束

    看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...

  8. hdu 3440(差分约束好题)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

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

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

随机推荐

  1. java正则表达式 1 -- 符号

    正则表达式主要是用于操作字符串的规则 1 首先体验一下正则表达式: 需求:某个串只能是数字 传统方法: public class Demo2{ public static void main(Stri ...

  2. 基于phonegap,html5,ratchet,handlebars等技术的微表情APP

    该app是由很多有意思的微表情构成的,支持40种表情,并且每种表情都有不同的状态,主要有搜索表情,分享表情,摇一摇换表情等功能.目前只支持安卓版.由前期构思,到技术选型,到界面设计,到编码测试,再到发 ...

  3. lintcode-118-不同的子序列

    118-不同的子序列 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数. 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响.(比如,&q ...

  4. 域名解析的DNS缓存如何清理

    域名解析(DNS)缓存是什么? 域名解析缓存又名DNS缓存,常见表现名称是TTL:(TimeToLive)生存时间,就是域名解析记录在DNS服务器中的存留有效时间. 当各地的DNS服务器接受到解析请求 ...

  5. 正则表达式之旅_sed_awk

    谈谈正则表达式这个东西: 我想作为一个程序员,正则表达式大家绝对不陌生. 正则表达式好像一个有限则动机.主要作用是匹配,但是同时因为这个功能,我们可以扩展很多其他用法 像很多语言都引人了正则表达式:j ...

  6. SQLAlchemy技术文档(中文版)(上)

    在学习SQLAlchemy的过程中,好多时候需要查官方Tutorial,发现网上并没有完整的中文版,于是利用这两天空余时间粗略翻译了一下. 翻译效果很差....但也算是强迫自己通读一遍Tutorial ...

  7. Session接口常用方法

    org.hibernate.Session接口 beginTransaction 开启事务 clear 清缓存 close 关闭session connection - 过时 获取Connection ...

  8. [USACO07DEC]美食的食草动物Gourmet Grazers

    ---题面--- 题解: 首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛. 实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于 ...

  9. [Leetcode] Populating next right pointer in each node 填充每个节点的右指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  10. Vue根据URL传参来控制全局 console.log 的开关

    如果你的项目中console.log了很多信息,但是发到生产环境上又不想打印这些信息,这时候就需要设置一个全局变量,如:debug, 用正则匹配一下参数: const getQueryStr = (n ...