这是一道我好像没写过的最小割

这道题如果没有那\(m\)条限制,我们完全可以贪心来做

但是硬要用网络流怎么办

可以转化为最小割模型

我们将源点\(S\)表示为耕地\(A\),汇点\(T\)表示为耕地\(B\),对于一个点\(i\),源点向\(i\)连一条容量为\(a_i\)的边,\(i\)向汇点连一条容量为\(b_i\)的边

这样的话为了使得\(S\)和\(T\)不连通,所以对于\(i\)来说\(a_i\)和\(b_i\)必须割掉一条,于是转化成了一个最小割

还有\(m\)条限制,我们可以把限制视为割掉某些边中的一条边,那么就必须额外割掉一条边

我们对于每一个限制搞一个虚点,先是\(S\)向虚点连一条容量为\(c\)的边,之后这个虚点向限制包含的所有点连为\(INF\)的边

这样话如果这点和\(S\)之间的边被割掉,说明后面那条和\(T\)相连的边没有被割掉,所以就必须割掉那条容量为\(c\)的边

耕地\(B\)同理

之后这道题还需要当前弧优化

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#define re register
#define maxn 10005
#define INF 999999999
struct E
{
int v,nxt,w,f;
}e[4400000];
int head[maxn],d[maxn],cur[maxn];
int n,num=1,S,T,ans,m,Now;
inline void add_edge(int x,int y,int z)
{
e[++num].v=y;
e[num].nxt=head[x];
e[num].w=z;
head[x]=num;
}
inline int min(int a,int b){return (a<b)?a:b;}
inline void connect(int x,int y,int z){add_edge(x,y,z),add_edge(y,x,0);}
inline int BFS()
{
std::queue<int> q;
for(re int i=0;i<=Now;i++)
d[i]=0,cur[i]=head[i];
d[S]=1;
q.push(S);
while(!q.empty())
{
int k=q.front();
q.pop();
for(re int i=head[k];i;i=e[i].nxt)
if(!d[e[i].v])
{
if(e[i].w<=e[i].f) continue;
d[e[i].v]=d[k]+1;
q.push(e[i].v);
}
}
return d[T];
}
int dfs(int x,int now)
{
if(x==T||!now) return now;
int ff,flow=0;
for(re int& i=cur[x];i;i=e[i].nxt)
if(d[e[i].v]==d[x]+1)
{
ff=dfs(e[i].v,min(now,e[i].w-e[i].f));
if(ff<=0) continue;
flow+=ff,now-=ff;
e[i].f+=ff,e[i^1].f-=ff;
if(!now) break;
}
return flow;
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int main()
{
n=read();
S=0,T=n+1;
int a,b;
for(re int i=1;i<=n;i++) a=read(),connect(S,i,a),ans+=a;
for(re int i=1;i<=n;i++) b=read(),connect(i,T,b),ans+=b;
m=read();
Now=n+1;
int N,c1,c2,t;
for(re int i=1;i<=m;i++)
{
Now++,Now++;
N=read(),c1=read(),c2=read();
ans+=c1+c2;
connect(S,Now-1,c1);
connect(Now,T,c2);
for(re int j=1;j<=N;j++)
{
t=read();
connect(Now-1,t,INF);
connect(t,Now,INF);
}
}
while(BFS()) ans-=dfs(S,INF+1);
std::cout<<ans;
return 0;
}
/*
3
4 2 1
2 3 2
1
2 3 2 1 2
*/

【小M的作物】的更多相关文章

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

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

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

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

  3. P1361 小M的作物

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

  4. BZOJ_3438_小M的作物_最小割

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

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

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

  6. BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑

    我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...

  7. [网络流]小M的作物

    小\(M\)的作物(最小割) 做的第一道网络流,因为一个智障错误调了好久嘤嘤嘤 题目描述 小\(M\)在\(MC\)里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P ...

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

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

  9. luogu P1361 小M的作物

    题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...

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

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

随机推荐

  1. .net下 本地锁、redis分布式锁、zk分布式锁的实现

    为什么要用锁? 大型站点在高并发的情况下,为了保持数据最终一致性就需要用到技术方案来支持.比如:分布式锁.分布式事务.有时候我们在为了保证某一个方法每次只能被一个调用者使用的时候,这时候我们也可以锁来 ...

  2. [javaSE] IO流(FIle对象递归文件列表)

    获取File对象,new出来,构造参数:String目录名 调用File对象的list()方法,获取String[]数组文件名称 循环数组,列出所有文件包含隐藏文件 递归列出所有的数据 定义一个静态方 ...

  3. [javaSE] GUI(图形用户界面)

    java为gui提供的对象都在java.Awt和javax.Swing包中 Awt:抽象窗口工具包,依赖平台,调用系统的本地方法 Swing:完全由java实现的轻量级工具库 eclipse官方封装了 ...

  4. Java基础教程(2)--Java开发环境

    一.JVM.JRE和JDK的概念   对于初学者来说,这三个术语出现的频率很高,而且有关这它们的问题在面试题中也会经常出现.因此,理解它们的定义.区别和联系就显得尤为重要.在学习这几个专业术语之前,我 ...

  5. 三:Bootstrap-js插件

    模式框: <button class="btn btn-default btn-lg" data-toggle="modal" data-target=& ...

  6. BZOJ1103 [POI2007]大都市

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1.. ...

  7. web前端面试题(持续更新)

    此文是我本人在面试的时候遇到的问题和一些同学遇到的问题加资料上面的问题的总结.(将会持续更新,因为未有满意工作) 面试时有几点需要注意: 1.面试题目:根据你的等级和职位的变化,入门级到大神级,广度和 ...

  8. path-to-regexp快速拆分 url 路径中的参数信息

    介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...

  9. 实用的 Chrome Developers Tools

    做前端的,都喜欢 chrome , 里面的开发工具也很实用,网上看到文章不错,部分摘来分享 ------------------------------- console.log,中包含一些格式化的指 ...

  10. LeetCode算法题5----Longest Palindromic Substring

    #5. Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You ...