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的作物(最小割)相关推荐

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

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

  2. 洛谷 - P1361 小M的作物(最大流最小割)

    题目链接:点击查看 题目大意:给出 n 个植物,每个植物种在 A 农场的收益是 a[ i ] ,种在 B 农场的收益是 b[ i ] ,再给出 m 组关系,每组中的所有植物如果都在 A 农场的话额外收 ...

  3. (最小割)洛谷P1361 小M的作物

    洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...

  4. 网络流建图方法(二)——辅助点(虚点)决策法洛谷 P1361 小M 的作物 Dinic

    inic声明:本博客默认读者会最大流最小割的定理,会Dinic, 最小割在数值上 == 最大流 但是在意义上没有任何关系,姑且可以这样求得最小割,当然可以自行百度最小割的证明定理 还是从题目开始说起 ...

  5. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  6. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...

  7. 【洛谷1361】 小M的作物(最小割)

    传送门 洛谷 Solution 这是一个比较实用的套路,很多题目都有用,而且这个套路难以口胡出来. 考虑把每一个附加贡献重新建一个点,然后向必需的点连边,流量为val. 然后直接种植的从源点向这个点连 ...

  8. bzoj3438: 小M的作物

    这题是一道最大权闭合图的经典难题(by Rose_max) upd:不误人子弟了,这就是一个裸的最小割啊..... 然后构图的方式就是把作物值分成AB集合,一个在st一边,一个在ed一边,st连作物流 ...

  9. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

最新文章

  1. Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
  2. hdu--4028--dp
  3. 笔记 — 动画效果(Css3)
  4. python数字转字符串_python中如何将数字转字符串
  5. magento -- 如何在magento中进行产品的批量上传
  6. pdfobject.js和pdf.js的详解
  7. 计算机网络(谢希仁版)知识点汇总
  8. python中def demo是什么意思_Python def函数的定义、使用及参数传递实现代码
  9. 普通二极管伏安特性和肖特基二极管电压电流特性
  10. 通过ajax异步请求下载文件的方法
  11. 2018-2-13-win10-uwp-活动磁贴
  12. 我的微信公众号开通了!
  13. yahoo雅虎邮箱开通直邮(pop)功能
  14. 油猴安装、编写及添加脚本 笔记
  15. 「操作系统」深入理解死锁(什么是死锁?死锁形成条件?如何避免死锁?如何排查死锁?)
  16. 局域网下 共享文件夹
  17. 03 优先搜索(dfs bfs)、最小生成树(笛卡尔 prime)、两点最短路径(迪杰斯特拉 Floyd)
  18. ife2015spring-task0001笔记总结
  19. 知识蒸馏(Distillation)
  20. 电子表格控件Aspose.Cells V17.5全新发布 | 附下载

热门文章

  1. 行测-图形推理-8-图群类
  2. 任性的Moto,铱星的情怀
  3. vue.js毕业设计,基于vue.js前后端分离教室预约小程序系统 开题报告
  4. oracle dg 状态检查
  5. 2009年的法定假日放假安排
  6. STM32之CubeMX学习笔记(4)新建工程文件解读
  7. ant linux tools.jar,为什么ant在错误的目录中寻找tools.jar?
  8. Ubnt EdgeRouter ER-4 路由器的交换功能
  9. QML进阶(十)动态加载QML元素
  10. CSS实现图片居中显示的文字环绕功能