「BZOJ3438」小M的作物(最小割
3438: 小M的作物
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1891 Solved: 801
[Submit][Status][Discuss]
Description
Input
Output
只有一行,包括一个整数,表示最大收益
Sample Input
4 2 1
2 3 2
1
2 3 2 1 2
Sample Output
样例解释A耕地种1,2,B耕地种3,收益4+2+3+2=11。
1<=k< n<= 1000,0 < m < = 1000 保证所有数据及结果不超过2*10^9。
题解
被洛谷大佬刷到绿了 好过分QAQ
读了题之后就在想怎么处理组合和个体之间的不相容性。一开始打算用拆点的方法限流,然后粗略算了一下 边数会爆炸QAQ
然后看了题解(=_=),fa现可以巧妙的用上最小割
把源点当作A,汇点当作B,源点往每个作物连ai,作物往B连bi。
首先对于没有组合:
割一下,留在左边的种进A,右边的种进B,那么收益就是剩下来的边权之和。
对于组合:
建一个虚点,从源点连一条c1i,再往每个受它控制的点连INF;
再建一个虚点,往汇点连一条c2i,再从每个受它控制的点连INF;
(图是毛来的)
其中黄边为对应值,蓝边为INF
以下为建图合理性的证明:
首先,INF永远割不掉。
对于左边,如果S->c已经被割掉,也就是说c变成了B的大宝贝儿,
想让c这条支流断掉,有两种选择:割左边的黄线,或者把右边的黄线和c->T一起割掉。
而如果割右边的,则不符合一开始让c加入B战队的假定,且S->c割的不明不白。
所以反证得知此时左边的黄线肯定会断。
同理可证,如果c->T被割掉,X'到T也会断。
∴证得割掉组合内任意点,这个组合的群体优惠也会断掉。
而如果某个组合的左边黄线存在,
那么割它下面的绿线都是白割,反正过的去。
对于右边同理。
∴如果某个组合优惠被得到了,那么它的所有儿砸都会留下。易知此时流量既得到了组合优惠,也收到了单个收益。
所以这样建图是ojbk的。
建了图然后跑个dinic算最小割,再用总边权减一下就好了。
撒花~
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int INF=*1e9+;
struct emm{
int e,f,v;
}a[];
int h[];
int tot=;
int s,t;
void con(int x,int y,int w)
{
a[++tot].f=h[x];
h[x]=tot;
a[tot].e=y;
a[tot].v=w;
a[++tot].f=h[y];
h[y]=tot;
a[tot].e=x;
return;
}
queue<int>q;
int d[];
inline bool bfs()
{
memset(d,,sizeof(d));
d[s]=;
q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=h[x];i;i=a[i].f)
if(!d[a[i].e]&&a[i].v)
{
d[a[i].e]=d[x]+;
q.push(a[i].e);
}
}
return d[t];
}
int dfs(int x,int al)
{
if(x==t||!al)return al;
int fl=;
for(int i=h[x];i;i=a[i].f)
if(d[a[i].e]==d[x]+&&a[i].v)
{
int f=dfs(a[i].e,min(a[i].v,al));
if(f)
{
fl+=f;
al-=f;
a[i].v-=f;
a[i^].v+=f;
if(!al)break;
}
}
if(!fl)d[x]=-;
return fl;
}
int main()
{
//freopen("a.in","r",stdin);
int n;
scanf("%d",&n);
s=,t=;
long long all=;
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
all+=x;
con(s,i,x);
}
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
all+=x;
con(i,t,x);
}
int m;
scanf("%d",&m);
int nod=n;
for(int i=;i<=m;++i)
{
int ki,c1,c2;
scanf("%d%d%d",&ki,&c1,&c2);
nod++;
con(s,nod,c1);
con(nod+,t,c2);
all+=c1;
all+=c2;
for(int j=;j<=ki;++j)
{
int x;
scanf("%d",&x);
con(nod,x,INF);
con(x,nod+,INF);
}
nod++;
}
long long ans=;
while(bfs()){ans+=dfs(s,INF);}
cout<<all-ans;
return ;
}
「BZOJ3438」小M的作物(最小割的更多相关文章
- 【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的作物——最小割
题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可 ...
- BZOJ 3438: 小M的作物( 最小割 )
orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...
- 「SHOI2007」「Codevs2341」 善意的投票(最小割
2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 幼儿园里有n个小朋 ...
- 3438: 小M的作物[最小割]
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1073 Solved: 465[Submit][Status][Discus ...
- P1361 小M的作物 最小割理解
如果没有组合效益的存在 我们直接每个点两部分的最大值即可 换成网络流模型来看 即把S点看作是A田 把T点看作是B田 每种作物看作一个点 分别连边(S,i,A[i]) (i,T,B[i]) 最后图中所有 ...
- 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图
第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...
- [P1361] 小M的作物 - 最小割
没想到今天早上的第一题网络流就血了这么多发 从经典的二选一问题上魔改 仍然考虑最小割 #include <bits/stdc++.h> using namespace std; #defi ...
随机推荐
- Jetson TK1 三:项目相关安装
ROS.QT.pyserial2.7.罗技手柄驱动.navigation.slam和rviz等 激光雷达IP设置,tk1对应的IP设置,tk1串口设置 一.安装ros参见官网 二.安装QT 百度QT官 ...
- Android应用开发 WebView与服务器端的Js交互
最近公司再添加功能的时候,有一部分功能是用的html,在一个浏览器或webview中展示出html即可.当然在这里我们当然用webview控件喽 WebApp的好处: 在应用里嵌套web的好处有这么几 ...
- Android L中的RecyclerView 、CardView 、Palette的使用
<Material Design>提到,Android L版本中新增了RecyclerView.CardView .Palette.RecyclerView.CardView为用于显示复杂 ...
- 【嵌入式Linux+ARM】GPIO操作
1.GPIO介绍 GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚. 我们可以通过它们输出高低电平 或 读入引脚的状态. s3c2440中有 ...
- start_kernel——mm_init_owner
全部任务都具有自己的内存,启动阶段中的当前任务必须具备属于自己的内存. mm_init_owner()函数传递init_mm和init_task參数 mm/init-mm.c struct mm_st ...
- VS2012,VS2010无法生成dll程序集的解决办法
在我们做项目的时候总会遇到dll程序集无法生成导致各种问题. 通常我们的做法就是清理项目,然后重新生成,或者直接到bin目录下删除所有dll,然后重新生成. 有时候某几个dll就是不生成. 这时候就需 ...
- java开始到熟悉63-65
本次内容:java常用类 1.包装类 package array; public class wrapperclass { public static void main(String[] args) ...
- Erlang进程堆垃圾回收机制
原文:Erlang进程堆垃圾回收机制 作者:http://blog.csdn.net/mycwq 每一个Erlang进程创建之后都会有自己的PCB,栈,私有堆.erlang不知道他创建的进程会用到哪种 ...
- 我所见过的最简短、最灵活的javascript日期转字符串工具函数
我们知道javascript的Date对象并没有提供日期格式化函数.将日期对象转换成"2015-7-02 20:35:11"等这样的格式又是项目中非经常常使用的需求.近期在我们项目 ...
- [LightOJ 1018]Brush (IV)[状压DP]
题目链接:http://lightoj.com/volume_showproblem.php? problem=1018 题意分析:平面上有不超过N个点,如今能够随意方向划直线将它们划去,问:最少要划 ...