BZOJ3438 小M的作物
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3438
这题觉得和上题有点类似吧。
如果没有联合在一起的收成,可以比较好做[我们将属于A的表示到s集中,属于B的表示到t集中]:
s往所有i连a[i],所有i往t连b[i]。
这样的话,割集表示不选哪些,最后答案就是ans-最小割
现在考虑联合在一起的收成。
我们对于收成(wa,wb),我们把它拆成两个点u,v,一个与s相连,边权为wa,另一个与t相连,边权为wb。
但是我们需要保证当我选择wa的收益时,需要将令所有关于它的点都不能放在t集合里;当我们选择wb的收益时,需要令所有关于它的点都不在s集合里。
那么怎么构图呢?
就将u往所有相关的i连一条INF的边,所有i往v连一条INF的边。

自从看了那篇有趣的博客,我觉得画图就应该这样画意识流...
这一题RE了很多次,原因就是数组开小了。
边集究竟有多大呢?以最坏的恶意,那么每个收益都是全体点的,那么就是m*n*2条边,然后每个点也要连出去两条,就是(m*n*2+n*2)*2=(2000000+2000)*2=4004000,然后总共的点数是n+2*m=3000个点。
以后要多想一想再来开数组啊....
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; inline int in(){
int x=;char ch=getchar();
while(ch>'' || ch<'') ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return x;
} const int maxn=;
const int INF=0x3f3f3f3f; struct Node{
int data,next,low;
}node[]; #define now node[point].data
#define then node[point].next
#define www node[point].low int n,m,cnt,ans;
int s,t,Idex;
int w1[maxn],w2[maxn];
int cur[maxn],head[maxn];
int dis[maxn],que[maxn]; void add(int u,int v,int w){
node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;head[u]=cnt++;
node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=;head[v]=cnt++;
} bool BFS(){
memset(dis,-,sizeof(dis));
int H=,T=;que[]=,dis[]=;
while(H<T){
H++;
for(int point=head[que[H]];point!=-;point=then)
if(www && dis[now]<){
dis[now]=dis[que[H]]+;
que[++T]=now;
}
}
return dis[t]>;
} int dfs(int x,int low){
if(x==t) return low;
int Low;
for(int &point=cur[x];point!=-;point=then)
if(www && dis[now]==dis[x]+){
Low=dfs(now,min(low,www));
if(Low){
www-=Low,node[point^].low+=Low;
return Low;
}
}
return ;
} int main(){
#ifndef ONLINE_JUDGE
freopen("3438.in","r",stdin);
freopen("3438.out","w",stdout);
#endif n=in();
for(int i=;i<=n;i++) w1[i]=in(),ans+=w1[i];
for(int i=;i<=n;i++) w2[i]=in(),ans+=w2[i];
m=in();
t=n+(m<<)+;
for(int i=s;i<=t;i++) head[i]=-;
for(int i=;i<=n;i++)
add(s,i,w1[i]),add(i,t,w2[i]);
Idex=n;
int k,wa,wb,x;
for(int i=;i<=m;i++){
k=in(),wa=in(),wb=in();
Idex++;add(s,Idex,wa);ans+=wa;
Idex++;add(Idex,t,wb);ans+=wb;
while(k--){
x=in();
add(Idex-,x,INF),add(x,Idex,INF);
}
}
int flag;
while(BFS()){
for(int i=s;i<=t;i++) cur[i]=head[i];
while(){
flag=dfs(s,INF);
if(!flag) break;
ans-=flag;
}
}
printf("%d",ans);
return ;
}
BZOJ3438 小M的作物的更多相关文章
- bzoj3438: 小M的作物(那年花开最小割)
3438: 小M的作物 题目:传送门 题解: 最小割标准水题(做了几天的最小割之后表示是真的水) 为什么水:博主已经做过两道基本一样的题目了... 详情参考:bzoj3894 代码: #include ...
- BZOJ3438 小M的作物(最小割)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...
- BZOJ3438小M的作物——最小割
题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可 ...
- BZOJ3438 小M的作物(和拓展)
题目链接:戳我 我们如果要选择一种种植情况的话,一定是其他的选择都不可行了.这种决策问题用最小割来处理最好不过. 建图方式--A为源点,B为汇点.然后将每个点分别向A,B连边,边权为种植它的价值.组合 ...
- 【BZOJ3438】小M的作物 最小割
[BZOJ3438]小M的作物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...
- 【BZOJ-3438】小M的作物 最小割 + 最大权闭合图
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 825 Solved: 368[Submit][Status][Discuss ...
- 「BZOJ3438」小M的作物(最小割
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1891 Solved: 801[Submit][Status][Discus ...
- BZOJ 3438: 小M的作物( 最小割 )
orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...
- P1361 小M的作物
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...
随机推荐
- OpenFileDialog使用方法
OpenFileDialog基本属性 AddExtension 控制是否将扩展名自动添加到文件名上 CheckFileExists 指示用户指定不存在的文件时是否显示警告 CheckPathExist ...
- nginx学习笔记1
Nginx是使用c语言编写的,查看nginx编译时参数的设定 使用nginx -V命令查看 可以使用nginx -h命令查看命令帮助 配置文件中将worker process绑定到cpu的特定内核上 ...
- memcache 简单入门应用
1.memcache 简介和安装: 下载:下载文件,解压到某个地方. 2.数据存储格式 键值对,一个key对应一个值,一个值在内存中占用一个或多个4k大小的块. 3.php使用memcache的方式 ...
- C++读入两个参数
题目内容:编写程序计算两个整数的差. 输入描述:输入数据含有不超过50个整数对,每个整数队及每对整数的运算结果都不会超过231或-231. 输出描述:对于每次读入的一对整数,输出前者减去后者的差.每个 ...
- arcgis api for javascript 3.16开发(一)
原来一直都在用Flex开发arcgis的地图接口,用的时间很长,用的习惯也顺手,可Flex这个开发工具已经基本要淘汰了,并且地图借助flash的方式加载在浏览器里已经不能适应webgis的快速开发需求 ...
- C#和.NET版本
1999年,就听说微软公司在研发一种名为“cool”的新开发语言,而具体内幕一直是个谜,直到2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,这个谜底终于揭晓了,这 ...
- Simple Shopping Cart By AngularJS
<body ng-controller='CartController'> <h1>Your Order</h1> <div ng-repeat='item ...
- Android无法连接adb的解决方法
今天在折腾乐蛙时发现无法链接ADB了,但是手机却显示USB调试模式! 然后想起了大蛋曾经告诉我CM的解决方法,于是你懂得,俺差点就把菊花给卖了呢(/Д`)~゚。 adb shell rm -r /da ...
- windows下python+flask环境配置详细图文教程
本帖是本人在安装配置python和flask环境时所用到的资源下载及相关的教程进行了整理罗列,来方便后面的人员,省去搜索的时间.如果你在安装配置是存在问题可留言给我. 首先罗列一下python+fla ...
- java解析XML几种方式
第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序 ...