如果没有组合效益的存在 我们直接每个点两部分的最大值即可

换成网络流模型来看 即把S点看作是A田 把T点看作是B田 每种作物看作一个点 分别连边(S,i,A[i]) (i,T,B[i])

最后图中所有边权和减去最大流即为答案.这个很好理解,因为最小割=最大流,一种作物只能选择A,B里的一个

所以对于每个点必要删去一条边,删去的边相当于我们不要的选项 剩下的和S,T相连的边相当于我们的选择 此时删去的肯定是最小的边.

接下来我们要处理组合效应的问题.

每个组合效应有三种选择:A/B/无

这样对于每个组合只建一个点很难满足要求 则我们把每个组合拆成A,B两个点  A点和S建边(S,A,C1[i])  B点和T建边(B,T,C2[i]) 表示选择A,B能得到的贡献.

再对于组合里的每个数都连边(A,K[i],INF) (K[i],B,INF) 这样图中除边权为INF的边的边权减去跑出来的最大流即为答案.

为什么这样跑出来即是我们选择要删去的选项?

因为最小割不可能会割INF的边

每个组合效应的A点 他旗下的每个点要都选A他才能产生贡献,如果有一个选了B则会产生增广路径,那么就必须要割掉(S,A,C1[i])

每个组合效应的B点 他旗下的每个点要都选B他才能产生贡献,如果有一个选了A则同样会产生增广路径,必须要割掉(B,T,C2[i])

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=;
const int M=;
const int inf=0x3f3f3f3f;
int head[N],edge[M],to[M],next[M],cnt=;
void add(int u,int v,int w)
{
to[++cnt]=v;next[cnt]=head[u];edge[cnt]=w;head[u]=cnt;
to[++cnt]=u;next[cnt]=head[v];edge[cnt]=;head[v]=cnt;
}
int dep[N],used[N],pre[N],tot,s[N],ans,m,n,sum;
queue <int > q;
bool bfs()
{
while(!q.empty()) q.pop();
q.push();
memset(dep,,sizeof(dep));
dep[]=;
while(!q.empty()&&q.front()!=n+)
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=next[i])
{
int v=to[i],w=edge[i];
if(!dep[v]&&w)
{
dep[v]=dep[u]+;
q.push(v);
}
}
}
return !q.empty();
}
int main()
{
scanf("%d",&n);
int w,v,k,c1,c2;
for(int i=;i<=n;i++)
{
scanf("%d",&w);
sum+=w;
add(,i,w);
}
for(int i=;i<=n;i++)
{
scanf("%d",&w);
sum+=w;
add(i,n+,w);
}
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&k,&c1,&c2);
add(,i+n+,c1);sum+=c1;
add(i+n+m+,n+,c2);sum+=c2;
for(int j=;j<=k;j++)
{
scanf("%d",&v);
add(i+n+,v,inf);
add(v,i+n+m+,inf);
}
}
while(bfs())
{
memset(used,,sizeof(used));
s[++tot]=;
while(tot)
{
int u=s[tot];
if(u==n+)
{
int mi=inf,id;
for(int i=tot;i>;i--)
if(mi>=edge[pre[s[i]]])
{
mi=edge[pre[s[i]]];
id=i;
}
ans+=mi;
for(int i=tot;i>;i--)
{
edge[pre[s[i]]]-=mi;
edge[pre[s[i]]^]+=mi;
}
tot=id-;
used[n+]=;
}
else
{
for(int i=head[u];i;i=next[i])
{
int v=to[i],w=edge[i];
if(!used[v]&&dep[v]==dep[u]+&&w)
{
used[v]=;
s[++tot]=v;
pre[v]=i;
break;
}
}
if(u==s[tot]) tot--;
}
}
}
printf("%d\n",sum-ans);
return ;
}

P1361 小M的作物 最小割理解的更多相关文章

  1. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  2. [P1361] 小M的作物 - 最小割

    没想到今天早上的第一题网络流就血了这么多发 从经典的二选一问题上魔改 仍然考虑最小割 #include <bits/stdc++.h> using namespace std; #defi ...

  3. BZOJ 3438: 小M的作物( 最小割 )

    orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...

  4. BZOJ3438小M的作物——最小割

    题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可 ...

  5. 【BZOJ3438】小M的作物 最小割

    [BZOJ3438]小M的作物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...

  6. 3438: 小M的作物[最小割]

    3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1073  Solved: 465[Submit][Status][Discus ...

  7. 【BZOJ-3438】小M的作物 最小割 + 最大权闭合图

    3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 825  Solved: 368[Submit][Status][Discuss ...

  8. 小M的作物 最小割最大流

    题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第i种作物种植在A中种植可 ...

  9. 洛谷 P1361 小M的作物 解题报告

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P\)有\(n\)中作物的种子,每种作物的种子有1个(就是可以种一棵作物) ...

随机推荐

  1. Paid consultation (currently free 20190901)

    Master of Electrical Engineering, Chongqing University Range:01 College entrance examination, major, ...

  2. NDK学习笔记-文件的拆分与合并

    文件的拆分与合并在开发中经常会用到,上传或是下载的时候都有这样的运用 文件拆分的思路 将文件大小拆分为n个文件 那么,每个文件的大小就是等大小的 如果文件大小被n除不尽,那么就使用n+1个文件来拆分 ...

  3. Nginx 开启支持谷歌Brotli压缩算法

    参考链接:https://cloud.tencent.com/developer/article/1501009

  4. mongodb的安装部署-备份

    1.安装部署 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.10.tgz tar -zxf mongodb-linux- ...

  5. 《Brennan's Guide to Inline Assembly》学习笔记

    原文见Brennan's Guide to Inline Assembly. AT&T语法 vs Intel语法 DJGPP是基于GCC的,因此它使用AT&T/UNIT语法,这和Int ...

  6. 在vue项目中,将juery设置为全局变量

    1.首先执行:npm install  jQuery --save-dev,在package.json里加入jQuery. 2.修改build下的webpack.base.conf.js 方法一: 首 ...

  7. storm drpc分布式本地和远程调用模式讲解

    一.drpc 的介绍 1.rpc RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 2.drpc drp ...

  8. jsp获取Session中的值

    摘要:这个问题算是老生常谈了,我也是一段时间没弄过了,所以感觉有些忘了,就记录一下. 一.后端通过shiro在session中存储数据: // username是前台传过来的用户名 if (subje ...

  9. 认识函数(python)

    一般的函数都是有参数的,函数的参数都是放在函数定义的括号里的,函数参数的命名规则和我们说的变量的命名规则基本一样,一定要清晰明了.(能概括出它的意义,让人阅读你的代码,就知道这个参数是干嘛的就行).当 ...

  10. 【第一季】CH08_FPGA_Button 按钮去抖动实验

    [第一季]CH08_FPGA_Button 按钮去抖动实验 按键的消抖,是指按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性,降低响应灵敏度.因此,必须对抖动进行处理,即 ...