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. 【python 2.7】获取外部参数

    import sys res_0 = sys.argv[0] res_1 = sys.argv[1] res_2 = sys.argv[2] print res_0 print res_1 print ...

  2. sqlmap 进阶 (一)

    0x1 命令 以此类推,可以具体自己研究有哪些参数,放在哪,有什么用,怎么用 参考:https://blog.csdn.net/bo_mask/article/details/76130848 0x2 ...

  3. pstree命令详解

    基础命令学习目录首页 pstree命令是用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出来是谁创建了谁#pstree几个重要的参数:-A: 各进程树之间的连接以ASCII码字 ...

  4. Node.js中exports,module.exports以及require方法

    在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...

  5. Scrum Meeting 11.1

    成员 今日任务 明日计划 用时 徐越 学习利用servlet上传下载文件 代码迁移 4h 赵庶宏 数据库的连接及代码学习 数据库连接 2h 武鑫 设计界面;尝试写一些初步的代码,独立完成一些简单界面 ...

  6. java 实验1

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1352 姓名:杨光 学号:20135233 成绩:            指导教师:娄嘉鹏  实验 ...

  7. C++课程 second work _1025

    传送门 Problem 题目不是特别难,只是跪在了最后一个测试点(已解决). 最后一个测试点= = 无效节点...无力ing

  8. UVA - 10635 Prince and Princess LCS转LIS

    题目链接: http://bak.vjudge.net/problem/UVA-10635 Prince and Princess Time Limit: 3000MS 题意 给你两个数组,求他们的最 ...

  9. Unity3D游戏开发——访问集中式共享模块的设计模式

    什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.设计模式是开发人员在开发过程中面临的一般问题的解决方案,这些解决方案是众多开发人 ...

  10. JAVA自学日记——Part Ⅱ

    今天学习了类与对象,其中关于this关键字的用法,static静态变量与静态方法,以及引用传递需要特别注意一下. 首先是引用传递: 在本段程序中可以通过进行外部对类对象的属性赋值来更改,同时也可以通过 ...