【题解】小M的作物
\(\text{Solution:}\)
这题要求最大收获,可以转化为所有可能的收益减去最小割。
单个点很好连边 \((S\to pos\to T),\) 问题在于如何处理组合的点。
观察到,一个组合要不然全部都划分到某一个集合,要不然不做贡献。注意到组合里面的点是不能拆开的。
所以我们建立一个组合虚点,它连接所有组合内的点,边权是 \(\infty.\) 这样就一定可以避免把它们划分到不同集合中。
那么,我们可以考虑如下建模模型:
\(\text{S}\to \text{compose} \to \text{everypoints in this group} \to \text{compose endpoint} \to \text{T}.\)
本题我们可以把 \(A\) 看作 \(S,T\) 同理。
于是这个题再套上我们最熟悉的\(\text{Dinic}\)模板就过了。
最后来分析一下这个图的规模:
首先,所有点都应该有一个对应点,再加上每一个集合的开始点和结束点,共\(n+m+m\)个。最大是\(3000.\)
对于边:每个点对源点和汇点都会连边,这里是\(n+n.\)每一个组合,其边数是组合中的点数的两倍,共约为\(n+n+2mk.\)最大数据是\(2*10^6+2000.\)
根据\(Dinic\)的复杂度\(O(n^2 m)\)这个数量级显然会炸,但是出题人毕竟一定会让\(Dinic\)过,以及\(Dinic\)复杂度跑不满的原因,这个算法是可以过的。
#include<bits/stdc++.h>
using namespace std;
const int inf=(1<<30);
const int MAXN=2e6+10;
int tot=1,head[MAXN];
int dep[MAXN],cur[MAXN];
int n,a[MAXN],b[MAXN],m;
int Ans,c1[MAXN],c2[MAXN],S,T;
vector<int>v[MAXN];
struct E{int nxt,to,flow;}e[MAXN];
inline void add(int x,int y,int w){
e[++tot].to=y;e[tot].nxt=head[x];
e[tot].flow=w;head[x]=tot;
e[++tot].to=x;e[tot].nxt=head[y];
e[tot].flow=0;head[y]=tot;
}
bool bfs(int s,int t){
memset(dep,0,sizeof dep);
cur[s]=head[s];dep[s]=1;
queue<int>q;q.push(s);
while(!q.empty()){
s=q.front();
q.pop();
for(int i=head[s];i;i=e[i].nxt){
int j=e[i].to;
if(!dep[j]&&e[i].flow){
cur[j]=head[j];
dep[j]=dep[s]+1;
if(j==t)return true;
q.push(j);
}
}
}
return false;
}
int dfs(int s,int flow,int t){
if(flow<=0||s==t)return flow;
int rest=flow;
for(int i=cur[s];i;i=e[i].nxt){
int j=e[i].to;
if(dep[j]==dep[s]+1&&e[i].flow){
int tmp=dfs(j,min(rest,e[i].flow),t);
if(tmp<=0)dep[j]=0;
rest-=tmp;e[i].flow-=tmp;e[i^1].flow+=tmp;
if(rest<=0)break;
}
}
return flow-rest;
}
int dinic(int s,int t){
int ans=0;
for(;bfs(s,t);)ans+=dfs(s,inf,t);
return ans;
}
void Deal(){
S=0,T=n+m+m+1;
for(int i=1;i<=n;++i)add(S,i,a[i]),add(i,T,b[i]);
for(int i=1;i<=m;++i){
int pos=i+n;add(S,pos,c1[i]);
int posend=i+n+m;
for(int j=0;j<(int)v[i].size();++j)
add(pos,v[i][j],inf),add(v[i][j],posend,inf);
add(posend,T,c2[i]);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",a+i),Ans+=a[i];
for(int i=1;i<=n;++i)scanf("%d",b+i),Ans+=b[i];
scanf("%d",&m);
for(int i=1,k;i<=m;++i){
scanf("%d",&k);
scanf("%d%d",&c1[i],&c2[i]);
Ans+=c1[i];Ans+=c2[i];
for(int j=1,x;j<=k;++j){
scanf("%d",&x);
v[i].push_back(x);
}
}
Deal();
printf("%d\n",Ans-dinic(S,T));
return 0;
}
【题解】小M的作物的更多相关文章
- 善意的投票&小M的作物 题解
善意的投票: 因为只有\(2\)种意愿,不妨让想睡午觉的和源点连边,让不想睡午觉的和汇点连边.对于每一对好朋友,在他们之间连边.那么只要源点和汇点还联通,就存在一对好友是冲突的,我们现在要做的就是删去 ...
- BZOJ 3438: 小M的作物( 最小割 )
orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...
- BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑
我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...
- 【BZOJ3438】小M的作物 最小割
[BZOJ3438]小M的作物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...
- luogu P1361 小M的作物
题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...
- 「BZOJ3438」小M的作物(最小割
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1891 Solved: 801[Submit][Status][Discus ...
- bzoj3438: 小M的作物(那年花开最小割)
3438: 小M的作物 题目:传送门 题解: 最小割标准水题(做了几天的最小割之后表示是真的水) 为什么水:博主已经做过两道基本一样的题目了... 详情参考:bzoj3894 代码: #include ...
- 【BZOJ-3438】小M的作物 最小割 + 最大权闭合图
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 825 Solved: 368[Submit][Status][Discuss ...
- P1361 小M的作物
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...
- BZOJ_3438_小M的作物_最小割
BZOJ_3438_小M的作物_最小割 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物) ...
随机推荐
- Android开发之解决Error:(16) Error: "ssdk_baidutieba_client_inavailable" is not translated in "en" (Englis
由于添加ShareSDK文件,导致打包突然报错, 错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not tr ...
- 广州做假证c
广州做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...
- python笔记-正则表达式
什么是正则表达式: 正则表达式是一个特殊的字符序列,能帮助我们方便的检查一个字符串是否与某种模式匹配(定义往往都很枯燥) 也称之为”模式“,即可用于检查一个给定的字符串是否符合某种模式 举例: 我们定 ...
- 令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab
原文地址:http://www.cnblogs.com/pcchinadreamfly/archive/2012/04/26/2471317.html参考地址:http://blog.csdn.net ...
- Shader 的 Blend
Blend SrcAlpha OneMinusSrcAlpha //alpha blending Blend One OneMinusSrcAlpha //premultiplied alpha bl ...
- SpringCloud入门 消息总线 Bus
消息总线 1.概述 使用SpringCloud Bus配和Spring Cloud Config使用实现配置的动态刷新 Bus只支持消息处理:RabbitMQ和Kafaka. 能干嘛 能管理和传播分布 ...
- 0 mysql 安装
1 安装网址 https://dev.mysql.com/downloads/installer/ 选择 mysql server版本一路next 2.配置环境 mysql 默认安装位置是: C:\P ...
- Mysql慢查询(分析工具)
慢查询分析工具[mysqldumpslow] 常用的慢查询日志分析工具 汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出 语法: mysqldumpslow -s r -t ...
- C#开发PACS医学影像处理系统(一):开发背景和说明
本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关资料比较少,也借此机会丰富一下医学软件开发生态,讨论技术难点,希望大家互相帮助共同进步. 章节介绍及截图预览: ...
- Centos 镜像文件下载
1. Centos 官网 https://www.centos.org 进入下载页面,选择下载的版本即可 不推荐在官网下载,因为官网上提供的下载地址很多是国外网站,下载太慢了 2. 阿里云Centos ...