P1361 小M的作物(最小割)
P1361 小M的作物(最小割)
比较板子的题,关键是建图。
答案就是 s u m − sum- sum−最小割。
而根据最小割最大流定理,即可求出最小割。
复习一下
Dinic 算法流程:
bfs给图分层,一次找多条增广路径
bool bfs(){queue<int>q;q.push(st);mst(dep,0);dep[st]=1;//起点层数初始化为1,并入队列.while(!q.empty()){int u=q.front();q.pop();cur[u]=h[u];//弧优化初始化for(int i=h[u];i;i=e[i].nt){int v=e[i].to,w=e[i].w;//如果当前还有剩余流量并且节点v未访问.if(w&&!dep[v]) dep[v]=dep[u]+1,q.push(v);}}return dep[ed];//如果终点被分层说明有增广路,否则没有. }
dfs进行增广路径计算。
int dfs(int u,int c){if(u==ed) return c;int res=c;for(int &i=cur[u];i;i=e[i].nt){//弧优化int v=e[i].to,w=e[i].w;if(w&&dep[v]==dep[u]+1){//如果当前结点v在增广路径上且还有流量.int now=dfs(v,min(res,w));//暂存此时的贡献为nowif(!now) dep[v]=1;//如果流量为0说明该点已经没用了,走不了了,设置层数为1,避免重复访问.else e[i].w-=now,e[i^1].w+=now,res-=now;//否则修改边权,注意保证反悔性质,同时剩余流量减去.}if(!res) return c;//优化,如果剩余流量为0直接返回.}return c-res;//总流量-剩余流量=答案. }
一直进行bfs,直到找不到增广路径为止。
ll dinic(){ll s=0;while(bfs()) s+=dfs(st,inf);return s; }
code
// Problem: P1361 小M的作物
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1361
// Memory Limit: 125 MB
// Time Limit: 2000 ms
// Date: 2021-07-05 15:33:30
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=3e3+5,M=2e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
int n,a[N],b[N],st,ed,tot;
struct edge{int to,nt,w;
}e[M];
int h[N],cur[N],cnt=1,dep[N];
void add(int u,int v,int w){e[++cnt]={v,h[u],w},h[u]=cnt;e[++cnt]={u,h[v],0},h[v]=cnt;
}
int dfs(int u,int c){if(u==ed) return c;int res=c;for(int &i=cur[u];i;i=e[i].nt){int v=e[i].to,w=e[i].w;if(w&&dep[v]==dep[u]+1){int now=dfs(v,min(res,w));if(!now) dep[v]=1;//如果剩余路径的最大流为0,说明该点不用再遍历了. else e[i].w-=now,e[i^1].w+=now,res-=now;}if(!res) return c;//如果剩余流量为0,说明最大流不能再更大了,直接返回. }return c-res;
}
bool bfs(){queue<int>q;q.push(st);mst(dep,0),dep[st]=1;while(!q.empty()){int u=q.front();q.pop();cur[u]=h[u];//初始化 for(int i=h[u];i;i=e[i].nt){int v=e[i].to,w=e[i].w;if(w&&!dep[v]) dep[v]=dep[u]+1,q.push(v);}}return dep[ed];
}
ll dinic(){ll s=0;while(bfs()) s+=dfs(st,inf);return s;
}
int main(){scanf("%d",&n);tot=n;st=0,ed=N-1;ll sum=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]),add(st,i,a[i]),sum+=a[i];for(int i=1;i<=n;i++) scanf("%d",&b[i]),add(i,ed,b[i]),sum+=b[i];int m;scanf("%d",&m);for(int i=1;i<=m;i++){int x;scanf("%d",&x);int c1,c2;scanf("%d%d",&c1,&c2);sum+=c1+c2;add(st,++tot,c1);add(++tot,ed,c2);for(int j=1,y;j<=x;j++){scanf("%d",&y);add(tot-1,y,inf);add(y,tot,inf);}}printf("%lld\n",sum-dinic());return 0;
}
P1361 小M的作物(最小割)相关推荐
- 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图
第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...
- 洛谷 - P1361 小M的作物(最大流最小割)
题目链接:点击查看 题目大意:给出 n 个植物,每个植物种在 A 农场的收益是 a[ i ] ,种在 B 农场的收益是 b[ i ] ,再给出 m 组关系,每组中的所有植物如果都在 A 农场的话额外收 ...
- (最小割)洛谷P1361 小M的作物
洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...
- 网络流建图方法(二)——辅助点(虚点)决策法洛谷 P1361 小M 的作物 Dinic
inic声明:本博客默认读者会最大流最小割的定理,会Dinic, 最小割在数值上 == 最大流 但是在意义上没有任何关系,姑且可以这样求得最小割,当然可以自行百度最小割的证明定理 还是从题目开始说起 ...
- 网络流 最大流 最小割 费用流
[腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...
- BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...
- 【洛谷1361】 小M的作物(最小割)
传送门 洛谷 Solution 这是一个比较实用的套路,很多题目都有用,而且这个套路难以口胡出来. 考虑把每一个附加贡献重新建一个点,然后向必需的点连边,流量为val. 然后直接种植的从源点向这个点连 ...
- bzoj3438: 小M的作物
这题是一道最大权闭合图的经典难题(by Rose_max) upd:不误人子弟了,这就是一个裸的最小割啊..... 然后构图的方式就是把作物值分成AB集合,一个在st一边,一个在ed一边,st连作物流 ...
- 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))
题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp 的收益,求最大净收益. 解题思路: 树形 ...
最新文章
- Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
- hdu--4028--dp
- 笔记 — 动画效果(Css3)
- python数字转字符串_python中如何将数字转字符串
- magento -- 如何在magento中进行产品的批量上传
- pdfobject.js和pdf.js的详解
- 计算机网络(谢希仁版)知识点汇总
- python中def demo是什么意思_Python def函数的定义、使用及参数传递实现代码
- 普通二极管伏安特性和肖特基二极管电压电流特性
- 通过ajax异步请求下载文件的方法
- 2018-2-13-win10-uwp-活动磁贴
- 我的微信公众号开通了!
- yahoo雅虎邮箱开通直邮(pop)功能
- 油猴安装、编写及添加脚本 笔记
- 「操作系统」深入理解死锁(什么是死锁?死锁形成条件?如何避免死锁?如何排查死锁?)
- 局域网下 共享文件夹
- 03 优先搜索(dfs bfs)、最小生成树(笛卡尔 prime)、两点最短路径(迪杰斯特拉 Floyd)
- ife2015spring-task0001笔记总结
- 知识蒸馏(Distillation)
- 电子表格控件Aspose.Cells V17.5全新发布 | 附下载