BZOJ 1391 [Ceoi2008]order
1391: [Ceoi2008]order
Description
Input
Output
Sample Input
100 2
1 30
2 20
100 2
1 40
3 80
50
80
110
Sample Output
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的更多相关文章
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1105 Solved: 331[Submit][Statu ...
- bzoj 1391 [Ceoi2008]order(最小割)
[题意] 有n个有偿工作选做,m个机器,完成一个工作需要若干个工序,完成每个工序需要一个机器,对于一个机器,在不同的工序有不同的租费,但买下来的费用只有一个.问最大获益. [思路] 对于工作和机器建点 ...
- BZOJ 1391 [CEOI] Order - 网络流 最大流
Solution 非常简单的建边!!! 但是刚开始的代码不够体现社会主义的优越性, 于是我 .... 惨痛教训啊... 终于到了今天才能够体现社会主义优越性... Code #include<c ...
- 1391: [Ceoi2008]order
有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Input 第一行给出 N,M( ...
- P4177 [CEOI2008]order(网络流)最大权闭合子图
P4177 [CEOI2008]order 如果不能租机器,这就是最大权闭合子图的题: 给定每个点的$val$,并给出限制条件:如果取点$x$,那么必须取$y_1,y_2,y_3......$,满足$ ...
- [CEOI2008]order --- 最小割
[CEOI2008]order 题目描述: 有N个任务,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数, ...
- [Luogu4177][CEOI2008]order
luogu sol 这题有点像网络流24题里面的太空飞行计划啊. 最大收益=总收益-最小损失. 先令\(ans=\sum\)任务收益. 源点向每个任务连容量为收益的边. 每个机器向汇点连容量为购买费用 ...
- bzoj 1391
建图跑最小割,加当前弧优化. #include<iostream> #include<cstdio> #include<cstring> #include<q ...
随机推荐
- Linux 磁盘与文件系统(EXT2)简介
Linux 中,一切(或几乎一切)都是文件. 一.Linux 磁盘分区与文件系统 1.1 磁盘分区 磁盘的分区主要分为主分区和扩展分区 1)主分区:总共最多只能有四个主分区: 2)扩展分区:只能有一个 ...
- eos源码编译
编译源码 运行代码 在阿里云 纽约服务器上运行没有出现任何问题. 在其他电脑上出现很多问题. 搜集到的问题如下: 随着EOSIO软件越来越成熟,后来的开发者也越来越幸福.EOS相关源码的编译和运行变得 ...
- DebuggerVisualizer时,序列化引出的问题。
实现如下功能:http://www.cnblogs.com/devil0153/archive/2010/09/01/Visual-Studio-Custom-Debugger.html#288924 ...
- 配置idea
http://www.cnblogs.com/yangyquin/p/5285272.html
- string类型的常用方法
1. 在尾部插入/删除元素 string s("hello"); // 插入/删除一个字符 s.push_back('!'); s.pop_back(); // 插入多个字符 s. ...
- Final阶段中间产物
空天猎功能说明书:https://git.coding.net/liusx0303/Plane.git 空天猎代码控制:https://coding.net/u/MR__Chen/p/SkyHunte ...
- 20172308 实验一《Java开发环境的熟悉》实验报告
20172308 2017-2018-2 <程序设计与数据结构>实验1报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...
- Shell脚本 数据清洗
需要做的任务是将上图类似的格式的文件进行处理,将年月日小时分别提取出来放到每行的行尾(上图已清洗好) 自己的思路是先用cut命令将每行的年月日小时提取出来,分别给一个变量,然后再循环利用sed命令将年 ...
- 对网络助手的NABCD分析心得
Sunny--Code团队::刘中睿,杜晓松,郑成 我们小组这次做的软件名字叫为校园网络助手.在大学学习的同学都知道学校里面有着内网与外网两种,并且有着流量限制,所以我们设计出来了这项软件,它主要有着 ...
- android assets下rar文件解压到sd卡
参考的 http://hzy3774.iteye.com/blog/1704419 不过只能解压zip文件 最多也就能解压1M多把 ,我1.5M的可以,4M的不行 还有...之前傻逼的把raw和 ...