参考:https://blog.csdn.net/sd_invol/article/details/15813671

要点

  1. 每个任务的结束时间是固定的,不受任何因素影响
  2. 机器只在最一开始有用,在那之后都是任务之间的转换

连边

将任务拆点,入点 i, 出点 i', 连边 (i, i' [1,1], 0)

设源点 s_, 汇点 t_

  1. 对于机器 \(i (i \in [1, m])\), 连 (s_, i, 1, 0),即流量为1,费用为0

    1. 对每个任务 \(j\)

      • 如果 \(C[i][j] \le ss[i]\),连 (i, j, 1, D[i][j])
      • 否则如果 \(C[i][j] < tt[j]\),连 (i, j, 1, D[i][j] + k*(C[i][j] - s[j]))
      • 否则不连边
  2. 对于每个任务 \(i(i\in[1,n])\),
    1. 连 (i, i', [1,1],0), 即流量在 [1,1]范围内,费用为0的边
    2. 连 (i',t_, 1, 0)
    3. 对于另一个任务 j,考虑 i -> j 的转换, 即 \(endTime = tt[i] + E[i][j]\)
      • 如果 \(endTime \le ss[j]\), 连(i', j, 1, F[i][j])
      • 否则如果 \(endTime \lt tt[j]\) ,连 (i', j, 1, F[i][j] + k * (endTime - ss[j]))
      • 否则不连边

然后对该网络求有源汇的上下界网络流即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)
void err() { cout << "\033[39;0m" << endl; }
template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
const int N = 300 + 10;
const int M = 200010;
int n, m, k, s_, t_, s, t;
int ss[N], tt[N];
int C[N][N], D[N][N], E[N][N], F[N][N];
int head[N], nxt[M], ver[M], edge[M], cost[M], tot;
int d[N], v[N], incf[N], pre[N];
int ans, maxflow;
void add(int x, int y, int z, int c){
ver[++tot] = y, edge[tot] = z, nxt[tot] = head[x], head[x] = tot, cost[tot] = c;
ver[++tot] = x, edge[tot] = 0, nxt[tot] = head[y], head[y] = tot, cost[tot] = -c;
}
bool spfa(){
queue<int> q;
memset(d, 0x3f, sizeof d);
memset(v, 0, sizeof v);
q.push(s);
d[s] = 0, v[s] = 1;
incf[s] = inf;
while(q.size()){
int x = q.front();
q.pop();
v[x] = 0;
for (int i = head[x]; i;i=nxt[i]){
if(!edge[i])
continue;
int y = ver[i];
if(d[y] > d[x] + cost[i]){
d[y] = d[x] + cost[i];
incf[y] = min(incf[x], edge[i]);
pre[y] = i;
if(!v[y])
v[y] = 1, q.push(y);
}
}
}
if(d[t] == inf)
return false;
return true;
} void update(){
int x = t;
while(x != s){
int i = pre[x];
edge[i] -= incf[t];
edge[i ^ 1] += incf[t];
x = ver[i ^ 1];
}
maxflow += incf[t];
ans += d[t] * incf[t];
} int main(){
while(~scanf("%d%d%d", &n, &m, &k)){
if(n == 0 && m == 0 && k == 0)break;
tot = 1;
s_ = n + n + m + 1, t_ = s_ + 1, s = t_ + 1, t = s + 1;
for(int i=1;i<=t;i++) head[i] = 0;
ans = 0, maxflow = 0;
for(int i=1;i<=n;i++) scanf("%d%d", &ss[i], &tt[i]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d", &C[j][i]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d", &D[j][i]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d", &E[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d", &F[i][j]); // (i, i+n, [1,1], 0)
// s 向 出点 (s, i+n, 1, 0)
// 入点 向 t (i, t, 1, 0)
// 出点向t_ (i+n, t_, 1, 0)
for(int i=1;i<=n;i++){
add(s, i+n, 1, 0);
add(i, t, 1, 0);
add(i+n, t_, 1, 0);
}
// s_-> 机器连边 流量1, 费用0
for(int i=1;i<=m;i++){
add(s_, n+n+i, 1, 0);
}
// 机器与任务连边
for(int i=1;i<=m;i++){
int id = 2 * n + i;
for(int j=1;j<=n;j++){
if(C[i][j] <= ss[j]){ //在ss[j]之前就可以准备好
add(id, j, 1, D[i][j]);
} else if(C[i][j] < tt[j]){ // 无法在tt[j] 之前准备好
add(id, j, 1, D[i][j]+k*(C[i][j]-ss[j]));
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i == j) continue;
int endTime = tt[i] + E[i][j];
if(endTime <= ss[j]){
add(i + n, j, 1, F[i][j]);
} else if(endTime < tt[j]) {
add(i + n, j, 1, F[i][j] + k * (endTime - ss[j]));
}
}
}
add(t_, s_, inf, 0);
while(spfa()) update();
if(maxflow != n) puts("-1");
else printf("%d\n", ans);
}
return 0;
}

2013 Asia Hangzhou Regional Contest hdu4780 Candy Factory的更多相关文章

  1. 2013 Asia Hangzhou Regional Contest

    Lights Against Dudely http://acm.hdu.edu.cn/showproblem.php?pid=4770 15个位置,所以可以暴力枚举那些放,对于放的再暴力枚举哪个转, ...

  2. HDU4771(2013 Asia Hangzhou Regional Contest )

    http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目大意: 给你一幅图(N*M)“@”是起点,"#"是墙,“.”是路,然后图上有K个珠 ...

  3. HDU 3685 Rotational Painting(多边形质心+凸包)(2010 Asia Hangzhou Regional Contest)

    Problem Description Josh Lyman is a gifted painter. One of his great works is a glass painting. He c ...

  4. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)

    Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...

  5. 2012 Asia Hangzhou Regional Contest

    Friend Chains http://acm.hdu.edu.cn/showproblem.php?pid=4460 图的最远两点距离,任意选个点bfs,如果有不能到的点直接-1.然后对于所有距离 ...

  6. 2013 Asia Chengdu Regional Contest

    hdu 4786 Fibonacci Tree http://acm.hdu.edu.cn/showproblem.php?pid=4786 copyright@ts 算法源于ts,用最小生成树可以求 ...

  7. HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)

    Description Could you imaging a monkey writing computer programs? Surely monkeys are smart among ani ...

  8. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  9. zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest

    Conquer a New Region Time Limit: 5 Seconds      Memory Limit: 32768 KB The wheel of the history roll ...

随机推荐

  1. python+sklearn+kaggle机器学习

    python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...

  2. 2021升级版微服务教程4—Nacos 服务注册和发现

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 默认文件1610014380163 教程全目录「含视 ...

  3. SparkSQL学习进度9-SQL实战案例

    Spark SQL  基本操作 将下列 JSON 格式数据复制到 Linux 系统中,并保存命名为 employee.json. { "id":1 , "name&quo ...

  4. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  5. N叉树的最大深度-DFS

    再看这道题之前,先来一道类似的简单题. 题目:求二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示 ...

  6. 基于JavaFX实现的音乐播放器

    前言 这个是本科四年的毕业设计,我个人自命题的一个音乐播放器的设计与实现,其实也存在一些功能还没完全开发完成,但粗略的答辩也就过去了,还让我拿了个优秀,好开心.界面UI是参考网易云UWP版本的,即使这 ...

  7. Payment Spring Boot 1.0.4.RELEASE 发布,最易用的微信支付 V3 实现

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 欢迎ISSUE,欢迎 ...

  8. 一文读懂k8s之Pod安全策略

    导读 Pod容器想要获取集群的资源信息,需要配置角色和ServiceAccount进行授权.为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPo ...

  9. 用 UniRx 实现 Timeline 式的异步操作

      没接触 UniRx 之前,我在 Unity 中通常用 Coroutine 或 Callback 来实现异步操作.根据我的任务,一般都是去实现游戏组件的演出,比如:敌方角色图形显示后,我方角色 UI ...

  10. mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String

    犯了一个低级的错误,在传集合类型的参数时,把他当成字符串处理了,导致报类型转换的错误 把  and nsrsbh!=' ' 删掉就行了