1391: [Ceoi2008]order

Description

有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润

Input

第一行给出 N,M(1<=N<=1200,1<=M<=1200) 下面将有N块数据,每块数据第一行给出完成这个任务能赚到的钱(其在[1,5000])及有多少道工序 接下来若干行每行两个数,分别描述完成工序所需要的机器编号及租用它的费用(其在[1,20000]) 最后M行,每行给出购买机器的费用(其在[1,20000])

Output

最大利润

Sample Input

2 3
100 2
1 30
2 20
100 2
1 40
3 80
50
80
110

Sample Output

50

HINT


  此题颇为有趣。一看便能知道是最大权闭合子图。但怎么区分租赁与购买呢?做了此题,再与BZOJ 1497 [NOI2006]最大获利比较,一下子我就明白了。

  此题中,n个工作的获益先加在一起。源点S与n个工作连一条流量为获利的边,m台机器与汇点T连一条流量为购买费用的边,工作与机器之间连上相应的租赁费用。这样,跑一遍最大流(最小割),然后sum-maxflow即可。

  为什么是对的?因为租赁可以理解为暂时的专属的,而购买就是永恒的普遍的。这在建图中体现的很明显。

  而NOI那道题中,只不过没有租赁,所以工作与机器之间是inf。

  很有意思啊!

 /**************************************************************
Problem: 1391
User: Doggu
Language: C++
Result: Accepted
Time:4252 ms
Memory:47844 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
template<class T>inline void readin(T &res) {
static char ch;T flag=;
while((ch=getchar())<''||ch>'')if(ch=='-')flag=-;
res=ch-;while((ch=getchar())>=''&&ch<='')res=(res<<)+(res<<)+ch-;res*=flag;
} const int N = ;
const int M = ;
struct Edge {int v,upre,cap,flow;}g[M];
int head[N], ne=-;
inline void adde(int u,int v,int cap) {
g[++ne]=(Edge){v,head[u],cap,};head[u]=ne;
g[++ne]=(Edge){u,head[v],,};head[v]=ne;
} #include <queue>
std::queue<int> q;
int n, m, s, t, sum, d[N], cur[N];
bool BFS() {
while(!q.empty()) q.pop();
memset(d,,sizeof(d));
q.push(s);d[s]=;
while(!q.empty()) {
int u=q.front();q.pop();
for( int i = head[u]; i != -; i = g[i].upre ) {
int v=g[i].v;
if(!d[v]&&g[i].cap>g[i].flow) q.push(v), d[v]=d[u]+;
}
}
return d[t];
}
int DFS(int u,int a) {
if(u==t||a==) return a;
int flow=, f;
for( int &i = cur[u]; i != -; i = g[i].upre ) {
int v=g[i].v;
if(d[v]==d[u]+&&(f=DFS(v,std::min(a,g[i].cap-g[i].flow)))>) {
flow+=f;a-=f;
g[i].flow+=f;g[i^].flow-=f;
if(a==) break;
}
}
if(flow==) d[u]=;
return flow;
}
void maxflow() {
int flow=;
while(BFS()) {
memcpy(cur,head,sizeof(head));
flow+=DFS(s,0x3f3f3f3f);
}
printf("%d\n",sum-flow);
} int main() {
memset(head,-,sizeof(head));
readin(n);readin(m);s=;t=n+m+;
for( int i = , w, a, b, c; i <= n; i++ ) {
readin(w);readin(b);
adde(s,i,w);sum+=w;
for( int j = ; j <= b; j++ ) {
readin(a);readin(c);
adde(i,n+a,c);
}
}
for( int i = ,c; i <= m; i++ ) {
readin(c);
adde(n+i,t,c);
}
maxflow();
return ;
}

dinic最小割建图

BZOJ 1391 [Ceoi2008]order的更多相关文章

  1. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  2. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1105  Solved: 331[Submit][Statu ...

  3. bzoj 1391 [Ceoi2008]order(最小割)

    [题意] 有n个有偿工作选做,m个机器,完成一个工作需要若干个工序,完成每个工序需要一个机器,对于一个机器,在不同的工序有不同的租费,但买下来的费用只有一个.问最大获益. [思路] 对于工作和机器建点 ...

  4. BZOJ 1391 [CEOI] Order - 网络流 最大流

    Solution 非常简单的建边!!! 但是刚开始的代码不够体现社会主义的优越性, 于是我 .... 惨痛教训啊... 终于到了今天才能够体现社会主义优越性... Code #include<c ...

  5. 1391: [Ceoi2008]order

    有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Input 第一行给出 N,M( ...

  6. P4177 [CEOI2008]order(网络流)最大权闭合子图

    P4177 [CEOI2008]order 如果不能租机器,这就是最大权闭合子图的题: 给定每个点的$val$,并给出限制条件:如果取点$x$,那么必须取$y_1,y_2,y_3......$,满足$ ...

  7. [CEOI2008]order --- 最小割

    [CEOI2008]order 题目描述: 有N个任务,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数, ...

  8. [Luogu4177][CEOI2008]order

    luogu sol 这题有点像网络流24题里面的太空飞行计划啊. 最大收益=总收益-最小损失. 先令\(ans=\sum\)任务收益. 源点向每个任务连容量为收益的边. 每个机器向汇点连容量为购买费用 ...

  9. bzoj 1391

    建图跑最小割,加当前弧优化. #include<iostream> #include<cstdio> #include<cstring> #include<q ...

随机推荐

  1. centos7.6 安装nginx-1.14.2

    一.安装所需依赖环境 yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 二.下载nginx官方源 ...

  2. VMware启动Centos时出现错误Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks it depends on. .

    今天拔装虚拟机的硬盘的时候,没有关掉虚拟机,导致虚拟打开的时候出现:Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks i ...

  3. java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper

    RabbitMq配置时常见错误 java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper <de ...

  4. js中if else switch 条件判断的替代方法

    function condition(test){ return({ cat :function(){console.log('cat');}, dog :function(){console.log ...

  5. 记事本App之NABCD

    在经过了漫长的讨论之后,在经历了无数次提议.否定.再提议.改进之后.我们团队的团队项目终于有了结果,小组成员一致同意做一个移动端记事本的app.下面我就来详细的阐明我们项目的NABCD这5大项内容. ...

  6. Linux下查看cpu使用率

    top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况,类似于Windows的任务管理 器.下面详细介绍它的使用方法. top - 02:53:32 up 16 ...

  7. 韩剧TV APP案例分析

    产品 选择产品:韩剧TV 版本:Android版 选择理由:节假日坐车回家时使用较多次数的APP,刚好国庆坐车回家时正在使用,所以选择了这款APP. 第一部分:调研.评测 第一次上手体验 刚打开APP ...

  8. SQL Server 中几个有用的特殊函数

    在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_execu ...

  9. Appium 服务关键字(转)

    来源: https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md#appium-服务 ...

  10. APP端测试与web端测试的区别

    想要知道APP端测试与web端测试的区别 ,那么我们就要先来了解,web和app的区别. web项目,一般都是b/s架构,基于浏览器的,而app则是c/s的,必须要有客户端.那么在系统测试测试的时候就 ...