[网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]
将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向。之后将源点和汇点分别于黑白格子连边,边权即为点权,最后用总权值减去最小割即可。
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <cmath>
- #include <ctime>
- #include <queue>
- using namespace std;
- #define INF 0x3f3f3f3f
- template<const int _n,const int _m>
- struct Edge
- {
- struct Edge_base { int to,next,w; }e[_m]; int cnt,p[_n];
- Edge() { clear(); }
- void insert(const int x,const int y,const int z)
- { e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; p[x]=cnt; return ; }
- int start(const int x) { return p[x]; }
- void clear() { cnt=,memset(p,,sizeof(p)); }
- Edge_base& operator[](const int x) { return e[x]; }
- };
- int n,m,N,SSS,TTT,a[][];
- int level[],cur[];
- Edge<,> e;
- bool Bfs(const int S)
- {
- int i,t;
- queue<int> Q;
- memset(level,,sizeof(level));
- level[S]=;
- Q.push(S);
- while(!Q.empty())
- {
- t=Q.front(),Q.pop();
- for(i=e.start(t);i;i=e[i].next)
- {
- if(!level[e[i].to] && e[i].w)
- {
- level[e[i].to]=level[t]+;
- Q.push(e[i].to);
- }
- }
- }
- return level[TTT];
- }
- int Dfs(const int S,const int bk)
- {
- if(S==TTT)return bk;
- int rest=bk;
- for(int &i=cur[S];i;i=e[i].next)
- {
- if(level[e[i].to]==level[S]+ && e[i].w)
- {
- int flow=Dfs(e[i].to,min(e[i].w,rest));
- e[i].w-=flow;
- e[i^].w+=flow;
- if((rest-=flow)<=)break;
- }
- }
- if(bk==rest)level[S]=;
- return bk-rest;
- }
- int Dinic()
- {
- int flow=;
- while(Bfs(SSS))
- {
- memcpy(cur,e.p,sizeof(cur));
- flow+=Dfs(SSS,0x3f3f3f3f);
- }
- return flow;
- }
- int main()
- {
- freopen("grid.in","r",stdin);
- freopen("grid.out","w",stdout);
- int i,j,Sum=;
- scanf("%d%d",&n,&m);
- N=n*m;SSS=N+,TTT=SSS+;
- for(i=;i<=n;++i)for(j=;j<=m;++j)
- scanf("%d",&a[i][j]),Sum+=a[i][j];
- for(i=;i<=n;++i)
- {
- for(j=;j<=m;++j)
- {
- int t=(i-)*m+j;
- if(((i&) && !(j&)) || (!(i&) && (j&)))
- {
- e.insert(SSS,t,a[i][j]);
- e.insert(t,SSS,);
- if(i>)e.insert(t,t-m,INF),e.insert(t-m,t,);
- if(i<n)e.insert(t,t+m,INF),e.insert(t+m,t,);
- if(j>)e.insert(t,t-,INF),e.insert(t-,t,);
- if(j<m)e.insert(t,t+,INF),e.insert(t+,t,);
- }
- else
- {
- e.insert(t,TTT,a[i][j]);
- e.insert(TTT,t,);
- if(i>)e.insert(t-m,t,INF),e.insert(t,t-m,);
- if(i<n)e.insert(t+m,t,INF),e.insert(t,t+m,);
- if(j>)e.insert(t-,t,INF),e.insert(t,t-,);
- if(j<m)e.insert(t+,t,INF),e.insert(t,t+,);
- }
- }
- }
- printf("%d\n",Sum-Dinic());
- return ;
- }
[网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]的更多相关文章
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)
Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...
- BZOJ 1475: 方格取数( 网络流 )
本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- [BZOJ1475]方格取数 网络流 最小割
1475: 方格取数 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1025 Solved: 512[Submit][Status][Discuss] ...
- HDU 1569 方格取数(2) (最小割)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- P2774 方格取数(网络流)
https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...
- LuoguP2774 方格取数问题(最小割)
题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...
- 【PowerOJ1736&网络流24题】飞行员配对方案问题(最小割)
题意: n<=100,要求输出方案 思路:准备把没刷的24题从头搞一遍 输出方案的话就在增广的时候记一下另一端的编号就好 #include<bits/stdc++.h> using ...
随机推荐
- java静态代理实例
package test; class ProxyTest { public static void main(String[] args) { ProxyClass proxy = new Prox ...
- 网页分享URL
<a href="tencent://Message/?Uin=QQ号码&Site=qq联系">点击联系</a> 1.新浪微博:<a href ...
- 【转载】sql索引存储结构
一.引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助.有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步.[最近 ...
- JavaScript中.和[]有什么区别?
.与[]都可以用于读取或修改对象属性. <script> var myData={ name:"Adam", weather:"sunny", }; ...
- $tsinsenA1067$
\(problem\) 这种题目需要一个定理 \(a[1]+a[2]+a[3]+a[4]...=(a[1]%mod)+...\) 本人出奇的懒 然后 动态规划?(恰似枚举) #include < ...
- [ NOIP 1998 ] TG
\(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...
- unity之Rigidbody属性
Rigidbody属性 Mass表示物体的质量,数值类型为float,默认值为1.大部分物体的质量属性接近于0.1才符合日常生活感官感受,超过10 ,则失去了仿真效果. Drag表示平移阻力,其数值类 ...
- checkbox与文字混排无法对齐到一行的解决办法
直接上代码: <span><input style="vertical-align:middle" type="checkbox" name= ...
- Win32基础知识整理
1.定义字符串 在资源新建String table,增加新字符串: (win32加载) TCHAR tcIDName[255]=_T(""); LoadString(hInstan ...
- BAT文件如何注释
1.BAT文件中如何注释: 1.:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符) 2.rem 注释内容(不能出现重定向符号和管道符号) 3.echo 注释内容(不能出现重定向符号和管道符 ...