题目描述

传送门

题解

讲棋盘进行黑白染色,从超级源向所有黑点连边,容量为num;从所有白点向超级汇连边,容量为num;再从所有的黑点向与之相邻的白点连边,容量为INF。
求最小割(最大流)即为答案。

最小割是说最小的舍弃的边,并且将源点与汇点隔断。那么黑点与它相邻的白点不可能有通路,否则源点汇点割不断。这样的思想以后注意。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;const int max_n=35;
const int max_m=35;
const int max_N=max_n*max_m+2;
const int max_M=max_N*10;
const int max_e=max_M*2;
const int INF=1e9;int n,m,N,cap,loc,loc1,maxflow,sum;
int tot,point[max_N],next[max_e],v[max_e],remain[max_e];
int deep[max_N],cur[max_N],last[max_N],num[max_N];
queue <int> q;inline void addedge(int x,int y,int cap){++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap;++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;
}inline void bfs(int t){for (int i=1;i<=N;++i)deep[i]=N;deep[t]=0;for (int i=1;i<=N;++i)cur[i]=point[i];while (!q.empty()) q.pop();q.push(t);while (!q.empty()){int now=q.front(); q.pop();for (int i=point[now];i!=-1;i=next[i])if (deep[v[i]]==N&&remain[i^1]){deep[v[i]]=deep[now]+1;q.push(v[i]);}}
}inline int addflow(int s,int t){int ans=INF,now=t;while (now!=s){ans=min(ans,remain[last[now]]);now=v[last[now]^1];}now=t;while (now!=s){remain[last[now]]-=ans;remain[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}inline void isap(int s,int t){bfs(t);for (int i=1;i<=N;++i)num[deep[i]]++;int now=s;while (deep[s]<N){if (now==t){maxflow+=addflow(s,t);now=s;}bool has_find=false;for (int i=cur[now];i!=-1;i=next[i])if (deep[now]==deep[v[i]]+1&&remain[i]){has_find=true;cur[now]=i;last[v[i]]=i;now=v[i];break;}if (!has_find){int minn=N-1;for (int i=point[now];i!=-1;i=next[i])if (remain[i])minn=min(minn,deep[v[i]]);if (!(--num[deep[now]])) break;num[deep[now]=minn+1]++;cur[now]=point[now];if (now!=s)now=v[last[now]^1];}}
}int main(){tot=-1;memset(point,-1,sizeof(point));memset(next,-1,sizeof(next));scanf("%d%d",&n,&m);N=n*m+2;for (int i=1;i<=n;++i)for (int j=1;j<=m;++j){scanf("%d",&cap);sum+=cap;loc=(i-1)*m+j;if (i%2)//奇数排 if (j%2){//奇点为黑点addedge(1,1+loc,cap);if (i>1){loc1=(i-2)*m+j;addedge(1+loc,1+loc1,INF);}if (j>1){loc1=loc-1;addedge(1+loc,1+loc1,INF);}if (i<n){loc1=i*m+j;addedge(1+loc,1+loc1,INF);}if (j<m){loc1=loc+1;addedge(1+loc,1+loc1,INF);}} else addedge(1+loc,N,cap);//偶点为白点 else//偶数 if (j%2) addedge(1+loc,N,cap);else{addedge(1,1+loc,cap);if (i>1){loc1=(i-2)*m+j;addedge(1+loc,1+loc1,INF);}if (j>1){loc1=loc-1;addedge(1+loc,1+loc1,INF);}if (i<n){loc1=i*m+j;addedge(1+loc,1+loc1,INF);}if (j<m){loc1=loc+1;addedge(1+loc,1+loc1,INF);}} }isap(1,N);printf("%d\n",sum-maxflow);
}

总结

①建图一定要想清楚,遇到n=m的情况换一组。
②网络流模板还是要多写,又写挂了。

[网络流24题][BZOJ1475]方格取数(最小割)相关推荐

  1. 线性规划与网络流24题●09方格取数问题13星际转移问题

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没 ...

  2. 【BZOJ1475】方格取数 [最小割]

    方格取数 Time Limit: 5 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description 在一个n*n的方格里,每个格子里都有 ...

  3. [网络流][最大点权独立集] 方格取数

    预备知识: 点覆盖集:无向图G的一个点集,使得该图中所有边都至少有一个端点在该集合内. 最小点权覆盖集:在带点权无向图G中,点权之和最小的覆盖集. 点独立集:无向图G的一个点集,使得任两个在该集合中的 ...

  4. CSP2020-J2 题解 —— D题:方格取数

    题目相关 题目链接 目前还没有官方的题目,本题目来自洛谷,https://www.luogu.com.cn/problem/P7074?contestId=37027. 题目描述 设有 n×m 的方格 ...

  5. BZOJ1324Exca王者之剑BZOJ1475方格取数——二分图最大独立集

    题目描述   输入 第一行给出数字N,M代表行列数.N,M均小于等于100 下面N行M列用于描述数字矩阵 输出 输出最多可以拿到多少块宝石 样例输入 2 2 1 2 2 1 样例输出 4 题意就是选取 ...

  6. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

  7. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

  8. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  9. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

最新文章

  1. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
  2. 为DataGridView添加行号
  3. Python3中的68个内置函数总结
  4. 使用U盘在Mac机上装win8.1系统
  5. modsecurity配置指令学习
  6. SQL Server 临时表
  7. Mysql报错时区错误invalid timezone
  8. JVM总结---各处总结
  9. java socket 异常处理_Java Socket常见异常处理 和 网络编程需要注意的问题
  10. leetcode —— 12. 整数转罗马数字
  11. linux 路由器_为什么我要建立自己的自制Linux路由器
  12. python列表删除多个相同元素_Python遍历列表删除多个元素或者重复元素
  13. 操作系统(02326)第1章:操作系统概论
  14. theano学习--theano.function
  15. php 屏蔽deprecated,解决php deprecated 的问题
  16. 摄影构图学83年绝版_让模特露肩、露腿的摄影师们,我求求你别再祸害“古风摄影”了!...
  17. 优秀的NAS不光只有群晖,看看威联通在安全性上如何K掉群晖
  18. Echarts南丁格尔图.
  19. 论文阅读:Retrieval-augmented Generation across Heterogeneous Knowledge
  20. czl蒻蒟的OI之路4

热门文章

  1. 组队学习李宏毅的深度学习-1
  2. VOT2018总体性能以及各个算法的分析
  3. 关于微店整合微信支付时出现的的各种问题的记录 php版
  4. 黑科技|你们要的手机AR导航来了!
  5. 省市区三级联动html
  6. 微软azure是什么_什么是Microsoft Azure? 它是如何工作的?
  7. 自动更新局域网系统补丁[来源网路]
  8. 五分钟带你理解python闭包(闭环)
  9. 10000个微信红包封面,免费领取,人人有份
  10. 浅学C#(17)——Winform程序设计之ListBox、CheckListBox、ComboBox、ListView、ImageList、TabControl、PictureBox...