【小M的作物】
这是一道我好像没写过的最小割
这道题如果没有那\(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的作物】的更多相关文章
- 【BZOJ-3438】小M的作物      最小割 + 最大权闭合图
		
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 825 Solved: 368[Submit][Status][Discuss ...
 - BZOJ 3438: 小M的作物( 最小割 )
		
orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...
 - 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个(就是可以种一棵作物) ...
 - 洛谷 P1361 小M的作物 解题报告
		
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P\)有\(n\)中作物的种子,每种作物的种子有1个(就是可以种一棵作物) ...
 - BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑
		
我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...
 - [网络流]小M的作物
		
小\(M\)的作物(最小割) 做的第一道网络流,因为一个智障错误调了好久嘤嘤嘤 题目描述 小\(M\)在\(MC\)里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P ...
 - 【BZOJ3438】小M的作物 最小割
		
[BZOJ3438]小M的作物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...
 - luogu  P1361 小M的作物
		
题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...
 - 3438: 小M的作物[最小割]
		
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1073 Solved: 465[Submit][Status][Discus ...
 
随机推荐
- git常用小操作。-- 自用
			
编辑 .gitignore bin-debug/ 忽略所有的叫bin-debug文件夹和他下面的文件 编辑 .git/config [core] repositoryformatversion = ...
 - NET Core 应用程序 IIS 运行报错 502.3-Gateway
			
转自:http://www.zmland.com/forum.php?mod=viewthread&tid=941 将 NET Core 应用程序部署在 IIS 环境,默认配置下,如果任务执行 ...
 - mybatis问题: There is no getter for property named 'equipmentId' in 'class java.lang.String'
			
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
 - oracle 多列数据相同,部分列数据不同合并不相同列数据
			
出现这样一种情况: 前面列数据一致,最后remark数据不同,将remark合并成 解决办法: 最后一列:结果详情: 使用到的语句为: select a,b,c,wm_concat(d) d,wm_c ...
 - 中南月赛  1313: ZZY的宠物
			
1313: ZZY的宠物 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 114 Solved: 59[Submit][Status][Web Boar ...
 - C# 简单的loading提示控件
			
自己画一个转圈圈的控件 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
 - python学习之老男孩python全栈第九期_day026知识点总结——封装、property、类方法、初识反射
			
一. 封装 class Room: def __init__(self, name, length, width): self.__name = name self.__length = length ...
 - CF17E Palisection
			
题意 给定一个长度为n的小写字母串.问你有多少对相交的回文子串(包含也算相交) 相交的回文子串个数 \(mod\ 51123987\) Sol 求相交的回文子串不太好求 考虑用总数减去不相交的回文串个 ...
 - VScode基础设置
			
安装依赖包: • One Monokai • Aglia • One Dark Pro • Material Icon 漂亮的主题: Themes Quokka 是一个调试工具插件,能够根据你正在 ...
 - ES6框架的搭建
			
1.引入traceur.js http://google.github.io/traceur-compiler/bin/traceur.js 2.将Traceur编译器用于网页 new traceu ...