// 题目描述:
一个项目被分成几个部分,每部分必须在连续的天数完成。也就是说,如果某部分需要3天
才能完成,则必须花费连续的3天来完成它。对项目的这些部分工作中,
有4种类型的约束:FAS, FAF, SAF和SAS。两部分工作之间存在一个
FAS约束的含义是:第一部分工作必须在第二部分工作开始之后完成; Xa+Ta>=Xb
FAF约束的含义是:第一部分工作必须在第二部分工作完成之后完成; Xa+Ta>=Xb+Tb
SAF的含义是:第一部分工作必须在第二部分工作完成之后开始; Xa>=Xb+Tb
SAS的含义是:第一部分工作必须在第二部分工作开始之后开始。 Xa>=Xb
假定参与项目的人数足够多,也就是说可以同时作任意多的部分工作。
你的任务是编写程序,对给定的项目设计一个进度表,使得项目完成时间最短。
// 由上面的4条建立不等式建边 Xi表示i开始的时间
// 然后新建一个点 0 ,表示在所有任务完成后开始的点 那么有 X0>=Xi+T[i]
#include <iostream>
#include <map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 21010
#define maxm 1010
struct node{
int to;
int next;
int val;
}E[maxn];
int num;
int in[maxm];
int V[maxm];
int T[maxm];
int d[maxm],cnt[maxm];
bool f[maxm];
bool sfpa(int s,int n){ // s表示起点 n表示节点个数
queue <int> Q;
int u,v;
int e;
Q.push(s);
d[s]=;
f[s]=true;
while(!Q.empty()){
u=Q.front(); Q.pop();
cnt[u]++; //printf("%d ",u);
if(cnt[u]>n) return false;
f[u]=false;
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(d[u]+E[e].val<d[v]){
d[v]=d[u]+E[e].val;
if(!f[v])
{
f[v]=true;
Q.push(v);
}
}
}
}
// printf("\n");
return true;
}
void add(char *str,int a,int b){
if(strcmp(str,"FAS")==){
E[num].to=b;
E[num].val=T[a];
E[num].next=V[a];
V[a]=num++;
}else if(strcmp(str,"FAF")==){ E[num].to=b;
E[num].val=T[a]-T[b];// printf("a=%d b=%d %d ",a,b,E[num].val);
E[num].next=V[a];
V[a]=num++;
}else if(strcmp(str,"SAF")==){
E[num].to=b;
E[num].val=-T[b];// printf("a=%d b=%d %d ",a,b,E[num].val);
E[num].next=V[a];
V[a]=num++;
}else {
E[num].to=b;
E[num].val=;
E[num].next=V[a];
V[a]=num++;
}
}
int main(){
int i,j,k;
int n;
char str[];
int Case=;
while(scanf("%d",&n),n){ for(i=;i<=n;i++)
{
scanf("%d",&T[i]);
V[i]=-;
d[i]=MOD;
cnt[i]=;
f[i]=false;
in[i]=;
}
i=;
V[i]=-;
d[i]=MOD;
cnt[i]=;
f[i]=false;
num=;
while(scanf("%s",str)){
if(strcmp(str,"#")==) break;
else {
scanf("%d %d",&i,&j);
in[j]=;
// printf("%s\n",str);
add(str,i,j);
}
}
for(i=;i<=n;i++){
//if(in[i])continue;
E[num].to=i;
E[num].val=-T[i];
E[num].next=V[];
V[]=num++;
}
int Min=MOD;
printf("Case %d:\n",Case++);
if(!sfpa(,n+))
printf("impossible\n");
else{
for(i=;i<=n;i++)
Min=min(Min,d[i]);//,printf("%d ",d[i]);
// if(Min==MOD){printf("impossible\n"); continue;}
for(i=;i<=n;i++)
printf("%d %d\n",i,d[i]-Min);
}
printf("\n"); } }

ZOJ 1455 Schedule Problem(差分约束系统)的更多相关文章

  1. HDU 3666.THE MATRIX PROBLEM 差分约束系统

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

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

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

  3. HDOJ 1534 Schedule Problem 差分约束

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

  4. zoj 2770 Burn the Linked Camp (差分约束系统)

    // 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...

  5. 【差分约束系统】【spfa】UVALive - 4885 - Task

    差分约束系统讲解看这里:http://blog.csdn.net/xuezhongfenfei/article/details/8685313 模板题,不多说.要注意的一点是!!!对于带有within ...

  6. UVA11478 Halum [差分约束系统]

    https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...

  7. POJ 3169 Layout (差分约束系统)

    Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...

  8. UVA - 11090 - Going in Cycle!!(二分+差分约束系统)

    Problem  UVA - 11090 - Going in Cycle!! Time Limit: 3000 mSec Problem Description You are given a we ...

  9. UVA - 11478 - Halum(二分+差分约束系统)

    Problem  UVA - 11478 - Halum Time Limit: 3000 mSec Problem Description You are given a directed grap ...

随机推荐

  1. iOS开发网络编程之断点续传-NSURLConnection

    最近在做一个小项目的时候,发现使用NSURLSession或者AFNNetworking进行断点续传时诸多的不便,于是自己封装了一个类来实现断点续传,在程序重新启动时仍然可以继续下载(需自己调用方法) ...

  2. ASP文件操作(FSO)详解

    实例一:写入文件 语法 object.CreateTextFile([要建立的文件],[如存在,是否替代]) <% Set fs =Server.CreateObject("Scrip ...

  3. poj 1797 Heavy Transportation(最短路变种2,连通图的最小边)

    题目 改动见下,请自行画图理解 具体细节也请看下面的代码: 这个花了300多ms #define _CRT_SECURE_NO_WARNINGS #include<string.h> #i ...

  4. poj 3067 Japan(线段树?,神奇卡时代码,暂未完)

    题目 //暴力的,没什么算法的,被琪琪视为傻逼的代码: //照者学长的神奇幸运卡时代码,虽然能AC,但是中途wa,tle了那么多次,啥也不想说了 //学长威武,能想出sum必须要是—— __int64 ...

  5. eclipse 或MyEclipse将工程进行移动的时候会对@Override报错的处理方法

    有时候导入javaSE,javaEE,android 工程的时候,明明是刚刚用过的没有问题的工程,但重新导入的时候就报错. 提示The method ... must override a sperc ...

  6. Linux查看随机启动服务

    Liunx操作系统跟Windos XP一样,有一批系统服务随机而启动:略懂电脑的Windows XP用户会禁止那些不必要的服务,以提高开机速度:如今安装了Ubuntu操作系统,咱们也有必要了解Ubun ...

  7. lintcode 中等题:Submatrix sum is 0 和为零的子矩阵

    和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...

  8. ASP.NET MVC 3 Razor 视图引擎 基本语法

    本篇博文将进入MVC 3 的世界了,首先学习一下MVC 3 新增的Razor视图引擎的基本语法. 1. 使用 @ 字符将代码添加到页面中.正如传统的aspx视图的<% %>相同.      ...

  9. [topcoder]HappyLetterDiv2

    http://community.topcoder.com/stat?c=problem_statement&pm=13245 就是有字符串,里面的字符可以随意两两消除,如果不等的话,那么最后 ...

  10. 【mongoDB基础篇①】安装与常用操作语句

    简述 mongoDB与redis同为noSql数据库,但是redis为kv数据库(key/value),而mongoDB为文档型数据库存储的是文档(Bson->json的二进制化).内部执行引擎 ...