洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图
第一次做最小割,不是很理解。
https://www.luogu.org/problemnew/show/P1361
要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点,价值就是边的容量。
然后最小割一定会割断每个中间结点的两边的其中一边,这样最大价值就顺带求出来了。
在这道题里面额外还有某些点成组出现的额外价值。题解的办法是分别虚拟两个结点代表两个集合,源点到集合a的容量是其价值,然后从a连到他的附属结点各边容量为无穷。无穷的边不能被最小割割断。所以要么是把a的从属结点到t的边全部割断,然后多出来a的附加价值,要么是把s到a的附加价值边割断使a不能流向t。画个图发现很巧妙。
转载自:https://www.luogu.org/blog/ButterflyDew/solution-p1361
这个属于最大权闭合子图,意思是某个节点(集合)若被选中则它的从属结点都要被选中,这种情况就原图建无穷流量边,各正权点连S容量为权,负权点连T容量为权的绝对值。答案=所有正权点的和-最小割。
当最小割割断右边的负权点的边的时候意味着你付出相应的代价购买它留在左边,当最小割割断左边的时候意味着你舍弃了他的价值但是也不用付出割断他的代价。
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=2e6+5,M=2e6+5; int n,m,s,t,tot=1,lnk[N],ter[M],nxt[M],val[M],dep[N],cnr[N];void add(int u,int v,int w) {ter[++tot]=v,nxt[tot]=lnk[u],lnk[u]=tot,val[tot]=w; }void addedge(int u,int v,int w) {add(u,v,w),add(v,u,0); }int bfs(int s,int t) {memset(dep,0,sizeof(dep));memcpy(cnr,lnk,sizeof(lnk));std::queue<int> q;q.push(s),dep[s]=1;while(!q.empty()) {int u=q.front(); q.pop();for(int i=lnk[u];i;i=nxt[i]) {int v=ter[i];if(val[i]&&!dep[v]) q.push(v),dep[v]=dep[u]+1;}}return dep[t]; }int dfs(int u,int t,int flow) {if(u==t) return flow;int ans=0;for(int i=cnr[u];i&&ans<flow;i=nxt[i]) {cnr[u]=i;int v=ter[i];if(val[i]&&dep[v]==dep[u]+1) {int x=dfs(v,t,std::min(val[i],flow-ans));if(x) val[i]-=x,val[i^1]+=x,ans+=x;}}if(ans<flow) dep[u]=-1;return ans; }ll dinic(int s,int t) {ll ans=0;while(bfs(s,t)) {ll x;while((x=dfs(s,t,1<<30))) ans+=x;}return ans; }int main() {ll sum=0;scanf("%d",&n);s=0,t=10000;for(int i=1;i<=n;i++){int u=s,v=i,w;scanf("%d",&w);addedge(u,v,w);sum+=w;}for(int i=1;i<=n;i++){int u=i,v=t,w;scanf("%d",&w);addedge(u,v,w);sum+=w;}int m;scanf("%d",&m);int id=n+1;while(m--) {int k;scanf("%d",&k);int w1,w2;scanf("%d%d",&w1,&w2);addedge(s,id,w1);addedge(id+1,t,w2);sum+=w1+w2;for(int i=0;i<k;i++){int x;scanf("%d",&x);addedge(id,x,0x3f3f3f3f);addedge(x,id+1,0x3f3f3f3f);}id+=2;}printf("%lld\n",sum-dinic(s,t));return 0; }
转载于:https://www.cnblogs.com/Yinku/p/10618586.html
洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图相关推荐
- 洛谷 - P1361 小M的作物(最大流最小割)
题目链接:点击查看 题目大意:给出 n 个植物,每个植物种在 A 农场的收益是 a[ i ] ,种在 B 农场的收益是 b[ i ] ,再给出 m 组关系,每组中的所有植物如果都在 A 农场的话额外收 ...
- (最小割)洛谷P1361 小M的作物
洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...
- P1361 小M的作物(最小割)
P1361 小M的作物(最小割) 比较板子的题,关键是建图. 答案就是 s u m − sum- sum−最小割. 而根据最小割最大流定理,即可求出最小割. 复习一下 Dinic 算法流程: bfs给 ...
- 网络流建图方法(二)——辅助点(虚点)决策法洛谷 P1361 小M 的作物 Dinic
inic声明:本博客默认读者会最大流最小割的定理,会Dinic, 最小割在数值上 == 最大流 但是在意义上没有任何关系,姑且可以这样求得最小割,当然可以自行百度最小割的证明定理 还是从题目开始说起 ...
- 图论 —— 网络流 —— 最小割 —— 最大权闭合子图
[概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...
- HDU 3061 Battle(最小割----最大权闭合图)
题意: Problem Description 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的战斗: 据侦查兵回报,前方共有N座城池,考虑到地势原因, ...
- 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化
题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...
- 洛谷 - P2774 方格取数问题(最小割-最大流+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*m的棋盘,每个位置都有一个正整数,现在要从方格中取数,要求任意两个数在方格中的位置不相邻,求取出的数的最大和 题目分析:正难则反,在这个题目中正着建图比较难, ...
- 洛谷2046 BZOJ2007 NOI2010 海拔 平面图最小割
题目链接 题意: 给你一个网格图,正反边边权不同,从海拔低的地方到海拔高的地方的代价是海拔差乘边权,海拔高到海拔低的地方不需要代价.左上角海拔是0,右下角海拔是1,让你任意安排其他点的海拔,使得每条边 ...
最新文章
- 适配器模式(三种)简单使用
- ZeroMQ接口函数之 :zmq_msg_init - 初始化一个空的ZMQ消息结构
- matlab-xlsread无法打开文件找不到文件
- shell常见的文件属性检查
- java反射效率对比_Java反射三种方式的效率对比
- jQuery 学习笔记之十二 (选项卡)
- 六度分离 HDU - 1869 (最短路径)
- ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)
- java security provide_Java SecurityManager類代碼示例
- VS2017透明背景和皮肤设置
- 个人记账系统c语言,C#实现_______个人记账程序
- 模型评估——混淆矩阵confusion_matrix
- 云加数支撑商业地产转型——无止境的商业想象力测试
- PCB板的绘制原来是这样完成的——布线
- 惠州教学实验室建设与管理
- 用 Python 基于均线交叉策略进行回测
- 如何选择数据拆分方法:不同数据拆分方法的优缺点及原因
- iOS好用的三方推荐
- M OP N数值运算问题
- 飞飞CMS最新版本DC04电脑端网站模板