Luogu_2774 方格取数问题

二分图最小割

第一次做这种题,对于某些强烈暗示性的条件并没有理解到。

也就是每一立刻理解到是这个图是二分图。

为什么?

横纵坐标为奇数的只会和横纵坐标为偶数的相连。

最大和=全局和-最小代价

所以可以反向缩小最小代价。

考虑奇数点与源点相连,偶数点与汇点相连,流量都是这个点的权值。

然后奇数点像偶数点连边,权值无限大。

这样构图。最小割是一个简单割。

割的流量就是最小的代价。

要么奇数点被割去,要么相邻的四个偶数点被割去

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue> using std::queue;
using std::min; const int maxn=301;
const int inf=0x7fffffff;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0}; struct node
{
int p;
int nxt;
int value;
node(int a=0,int b=0,int c=0)
{
p=a;
value=b;
nxt=c;
}
}; node line[maxn*maxn<<1];
int head[maxn*maxn],tail;
int cur[maxn*maxn];
int Dis[maxn*maxn];
int Map[maxn][maxn];
int S,T; void add(int a,int b,int c,int d)
{
line[++tail]=node(b,c,head[a]);
head[a]=tail;
line[++tail]=node(a,d,head[b]);
head[b]=tail;
} void init(int n,int m)
{
S=n*m;T=n*m+1;
tail=-1;
memset(head,-1,sizeof(head));
} int Bfs(int s,int t)
{
queue<int>q;
memset(Dis,0,sizeof(Dis));
Dis[s]=1;q.push(s);
while(!q.empty())
{
int pas=q.front();q.pop();
for(int i=head[pas];i!=-1;i=line[i].nxt)
{
int v=line[i].p;
if(Dis[v]||!line[i].value) continue;
Dis[v]=Dis[pas]+1;
q.push(v);
}
}
for(int i=0;i<=T;i++) cur[i]=head[i];
return Dis[t];
} int Dfs(int now,int aim,int limte)
{
if(now==aim||!limte) return limte;
int res=0,f;
for(int &i=cur[now];i!=-1;i=line[i].nxt)
{
int v=line[i].p;
if(Dis[v]==Dis[now]+1&&(f=Dfs(v,aim,min(limte,line[i].value))))
{
res+=f;
limte-=f;
line[i].value-=f;
line[i^1].value+=f;
if(!limte) break;
}
}
return res;
} int Dinic(int s,int t)
{
int res=0;
while(Bfs(s,t))
res+=Dfs(s,t,inf);
return res;
} int main()
{
int n,m,tot=0;
scanf("%d%d",&n,&m);
init(n,m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&Map[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(((i+j)&1)==1)
{
add(S,i*m+j,Map[i][j],0);
for(int k=0;k<4;k++)
if(i+dx[k]>=0&&i+dx[k]<n&&j+dy[k]>=0&&j+dy[k]<m)
add(i*m+j,(i+dx[k])*m+(j+dy[k]),inf,0);
}
else
add(i*m+j,T,Map[i][j],0);
tot+=Map[i][j];
}
printf("%d",tot-Dinic(S,T));
return 0;
}

Luogu_2774 方格取数问题的更多相关文章

  1. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  3. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

  4. [HDU 1565+1569] 方格取数

    HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  6. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

  7. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

  8. [动态规划]P1004 方格取数

    ---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...

  9. P2045 方格取数加强版

    P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...

随机推荐

  1. HDOJ2037 今年暑假不AC (经典的贪心问题)

    Description “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会 ...

  2. edge浏览器无法解析<img>的原因

    使用<img>标签插入图片,使用谷歌,ie,等浏览器测试,都可以正常显示图片,但是edge浏览器就是实现不了.经过排查测试,不是文件格式的问题,而是路径带有中文.相对路径中虽然不带中文,但 ...

  3. frameset 在 Google Chrome 中无法隐藏左边栏解决方法!

    使用Frameset 框架,发现在IE下, <frameset name="mainDefine" cols="200,10,*" frameborder ...

  4. 虚树(Bzoj3611: [Heoi2014]大工程)

    题面 传送门 虚树 把跟询问有关的点拿出来建树,为了方便树\(DP\) 在\(LCA\)处要合并答案,那么把这些点的\(LCA\)也拿出来 做法:把点按\(dfs\)序排列,然后求出相邻两个点的\(L ...

  5. 【转载】MySQL数据库可以用任意ip连接访问的方法

    通过CMD命令行修改数据库表的一个字段的值,实现连接,访问. 第一步.找到MYSQL软件安装所在的bin目录: (1)cd\当前目录 (2)指定MYSQL安装的bin目录 (3)输入 -h local ...

  6. Linux VPS主机利用Crontab实现定时重启任务

    第一.安装Crontab可执行环境 一般的VPS/服务器是支持的,但是有些可能没有支持就需要我们来给予安装. A - centos系统 #安装Crontab yum install vixie-cro ...

  7. js中的正则表达式的运用

    正则表达式是一个拆分字符串并查询相关信息的过程:是现代开发中很重要的一环.作为一个web开发人员必须牢牢掌握这项技能,才能尽情得在js中驰骋. 1.创建正则表达式: 正则表达式(regular exp ...

  8. spring 与mybatis 整合总结

    刚看完同学给我的代码,我忍不住爆粗.去TMD,写得像坨屎,恶心,乱七八糟,这让我怎么交差??一行代码注释都没有,还很自以为是的傲慢.“这都不懂?这就是Mybatis啊,有很多种方法实现.....” 操 ...

  9. 养兔子Fibo函数优化

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. zabbix安装故障点分析

    故障点分析:故障一:  2637:20151009:050431.719 [Z3001] connection to database 'zabbix' failed: [1045] Access d ...