P2774 方格取数问题(网络流)
emm........仔细一看,这不是最大权闭合子图的题吗!
取一个点$(x,y)$,限制条件是同时取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不过权值取负而已
于是我们把图分为黑点和白点,同颜色点之间不相邻,不同颜色的点相邻(如将$(x+y)%2==1$的点记为黑点)
假装把白点的权值都看成负的
记$link(p,q,val)$为$p$向$q$连一条$val$的边(包括反向边)
蓝后根据最大权闭合子图的套路
对于黑点$p$与相邻的白点$q$
$link(S,p,val_p)$
$link(p,q,inf)$
$link(q,T,val_q)$($val_q$不取负)
蓝后就可以愉快地跑最小割辣
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- #define N 100005
- #define inf 1000000000
- const int d1[]={,,-,};
- const int d2[]={,,,-};
- int n,m,d[N],cur[N],tot,S,T; bool vis[N];
- queue <int> h;
- int cnt=,hd[N],nxt[N],ed[N],poi[N],val[N];
- inline void adde(int x,int y,int v){
- nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
- ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
- }
- inline void link(int x,int y,int v){adde(x,y,v),adde(y,x,);}
- inline int id(int x,int y){return (x-)*m+y;}
- bool bfs(){
- memset(vis,,sizeof(vis));
- h.push(S); vis[S]=;
- while(!h.empty()){
- int x=h.front(); h.pop();
- for(int i=hd[x];i;i=nxt[i]){
- int to=poi[i];
- if(!vis[to]&&val[i]>)
- vis[to]=,d[to]=d[x]+,h.push(to);
- }
- }return vis[T];
- }
- int dfs(int x,int a){
- if(x==T||a==) return a;
- int F=,f;
- for(int &i=cur[x];i;i=nxt[i]){
- int to=poi[i];
- if(d[to]==d[x]+&&(f=dfs(to,min(a,val[i])))>)
- a-=f,F+=f,val[i]-=f,val[i^]+=f;
- if(!a) break;
- }return F;
- }
- int dinic(){
- int re=;
- while(bfs()){
- for(int i=;i<=T;++i) cur[i]=hd[i];
- re+=dfs(S,inf);
- }return re;
- }
- void draw(int x,int y){
- int p=id(x,y),w;
- scanf("%d",&w); tot+=w;
- if((x+y)&){//不要重复连边
- link(S,p,w);
- for(int i=;i<;++i){
- int r1=x+d1[i],r2=y+d2[i];
- if(r1>&&r1<=n&&r2>&&r2<=m)
- link(p,id(r1,r2),inf);
- }
- }else link(p,T,w);
- }
- int main(){
- scanf("%d%d",&n,&m);
- S=n*m+; T=S+;
- for(int i=;i<=n;++i)
- for(int j=;j<=m;++j)
- draw(i,j);
- printf("%d",tot-dinic());
- return ;
- }
P2774 方格取数问题(网络流)的更多相关文章
- P2774 方格取数问题 网络流重温
P2774 方格取数问题 这个题目之前写过一次,现在重温还是感觉有点难,可能之前没有理解透彻. 这个题目要求取一定数量的数,并且这些数在方格里面不能相邻,问取完数之后和最大是多少. 这个很好的用了网络 ...
- P2774 方格取数问题 网络流
题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...
- P2774 方格取数问题(最小割)
P2774 方格取数问题 一看题目便知是网络流,但由于无法建图.... 题目直说禁止那些条件,这导致我们直接建图做不到,既然如此,我们这是就要逆向思维,他禁止那些边,我们就连那些边. 我们将棋盘染色, ...
- 洛谷 P2774 方格取数问题 解题报告
P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...
- P2774 方格取数问题 网络最大流 割
P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...
- P2774 方格取数(网络流)
https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...
- P2774 方格取数问题
题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...
- CODEVS_1227 方格取数2 网络流 最小费用流 拆点
原题链接:http://codevs.cn/problem/1227/ 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1, ...
- [洛谷P2774]方格取数问题
题目大意:给你一个$n\times m$的方格,要求你从中选择一些数,其中没有相邻两个数,使得最后和最大 题解:网络流,最小割,发现相邻的两个点不可以同时选择,进行黑白染色,原点向黑点连一条容量为点权 ...
随机推荐
- 嵌入式linux内存越界定位和解决 (转)
https://blog.csdn.net/meejoy/article/details/41729585 https://blog.csdn.net/killmice/article/details ...
- 工作流JBPM
jbpm3 共分为12种节点 1.node节点:如果该节点没有定义ACTION,则流转到该节点时不会停留,会继续往下走,如果定义ACTION,执行完ACTION后会停在该节点上,调用 token.si ...
- 修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码
https://www.jianshu.com/p/554b9575c5da Windows下修改MySql 5.6的字符集,根据网上提供的方法.就是修改my.ini配置文件,然后增加几个字段就可以了 ...
- Servlet学习1
1.首先在Tomcat的webapp目录下新建文件夹myWebapp,作为自己的web应用. 2.myWebapp下新建WEB-INF(必须这个名)目录,WEB-INF下新建classes目录放置se ...
- mysql5安装
一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comp ...
- 2018-2019-2 网络对抗技术 20165321 Exp6 信息搜集与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 百度查找IP地址: 查了一下kali的IP地址 https://fofa.so/的使用: 查询了一 ...
- .NET中结构和类的区别
最近在学习Swift语言,看到了枚举这一章,Swift可以支持在枚举中定义方法...于是想到了回顾一下.NET中枚举.结构.类之间区别. 枚举在.NET较为简单,这里就不作比较,只谈谈结构和类. 1. ...
- mysql优化:explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- C# 使用Newtonsoft.Json读写Json文件
{ "CAN": false, "AccCode": 4294901856, "Id": 768, "BPointMove&quo ...
- C# 数组在内存中的存储
C# 数组是引用类型,那么在内存中是如何存储的呢? 在VS中调试C#程序,如何查看内存.寄存器.反汇编 在这篇文章里看到了如何在VS 中查看内存 先断点打在数组创建后语句那里,点debug->W ...