P2774 方格取数问题

一看题目便知是网络流,但由于无法建图....

题目直说禁止那些条件,这导致我们直接建图做不到,既然如此,我们这是就要逆向思维,他禁止那些边,我们就连那些边.

我们将棋盘染色,一个点向四周连边,我们的目标是使的这些边不起作用,我们将黑点与s联通,白点与t联通.

之后我们就要考虑一个事情,只要一个黑点与白点由流,此时一定s到t有流.这样我们就能想到最小割...

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=110,INF=2e9;
int sum,n,m,tot=1,s,t,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},d[N*N],current[N*N];
int link[N*N],c[N][N];
struct edge{int y,v,next;}a[N*N*8];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline void add(int x,int y,int v)
{
a[++tot].y=y;a[tot].v=v;a[tot].next=link[x];link[x]=tot;
a[++tot].y=x;a[tot].v=0;a[tot].next=link[y];link[y]=tot;
}
inline bool bfs()
{
queue<int>q;q.push(s);
memset(d,0,sizeof(d));
memcpy(current,link,sizeof(current));
d[s]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=link[x];i;i=a[i].next)
{
int y=a[i].y;
if(d[y]||!a[i].v) continue;
d[y]=d[x]+1;
q.push(y);
if(y==t) return true;
}
}
return false;
}
inline int dinic(int x,int flow)
{
if(x==t) return flow;
int rest=flow,k;
for(int i=current[x];i&&rest;i=a[i].next)
{
current[x]=i;
int y=a[i].y;
if(d[y]==d[x]+1&&a[i].v)
{
k=dinic(y,min(rest,a[i].v));
if(!k) d[y]=0;
a[i].v-=k;
a[i^1].v+=k;
rest-=k;
}
}
return flow-rest;
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) c[i][j]=read(),sum+=c[i][j];
s=0;t=n*m+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if((i+j)%2==0)
{
add(s,(i-1)*m+j,c[i][j]);
for(int k=0;k<4;++k)
{
int x=i+dx[k],y=j+dy[k];
if(x>=1&&x<=n&&y>=1&&y<=m) add((i-1)*m+j,(x-1)*m+y,INF);
}
}
else add((i-1)*m+j,t,c[i][j]);
}
int maxflow=0,flow;
while(bfs())
while(flow=dinic(s,INF)) maxflow+=flow;
printf("%d",sum-maxflow);
return 0;
}

P2774 方格取数问题(最小割)的更多相关文章

  1. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...

  2. HDU 1569 方格取数(2) (最小割)

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

  3. [BZOJ1475]方格取数 网络流 最小割

    1475: 方格取数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 512[Submit][Status][Discuss] ...

  4. LuoguP2774 方格取数问题(最小割)

    题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...

  5. 【bzoj1475】方格取数 网络流最小割

    题目描述 在一个n*n的方格里,每个格子里都有一个正整数.从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大. 输入 第一行一个数n:(n<=30) 接下来n行每行n ...

  6. luogu2774 [网络流24题]方格取数问题 (最小割)

    常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...

  7. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  8. P2774 方格取数问题(网络流)

    P2774 方格取数问题 emm........仔细一看,这不是最大权闭合子图的题吗! 取一个点$(x,y)$,限制条件是同时取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不 ...

  9. 洛谷 P2774 方格取数问题 解题报告

    P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

随机推荐

  1. 求1+2+…+n

    求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示例 2: ...

  2. python math详解(1)

    python math详解(1) 一.导入 python要调用math要进行导入 import math 二.返回值 math包里有一些值 比如 math.pi 返回pi的值 约为3.14 math. ...

  3. 修改文件权限后,再git pull后提示文件已修改

    问题: 从git上面pull下来脚本文件,在Linux上面执行.执行chmod +x 后,如果再次有修改文件,git pull 的提示会终止.每次都要使用 git checkout -- <fi ...

  4. P1909 [NOIP2016 普及组] 买铅笔

    如果她选择购买第一种包装,那么她需要购买29份,共计2×29=58支,需要花费的钱为2×29=58. 实际上,P老师会选择购买第三种包装,这样需要买22份.虽然最后买到的铅笔数 量更多了,为30×2= ...

  5. ☕【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了!

    JPA的介绍分析 Java持久化API (JPA) 显著简化了Java Bean的持久性并提供了一个对象关系映射方法,该方法使您可以采用声明方式定义如何通过一种标准的可移植方式,将Java 对象映射到 ...

  6. Yaml书写方法详解

    一.关于yaml语法详解 yaml通常以空格做锁进,一般是2个或者4个,如果写更多,只要格式对其 就不会报错 二.yaml基本语法规则 大小写敏感 使用锁进表示层级关系 缩紧时候不允许用tab键,只能 ...

  7. CF573D-Bear and Cavalry【动态dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF573D 题目大意 给出\(n\)个人\(n\)匹马,每个人/马有能力值\(w_i\)/\(h_i\). 第\(i ...

  8. [模板]多项式全家桶小记(求逆,开根,ln,exp)

    前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...

  9. YbtOJ#763-攻城略池【线段树合并】

    正题 题目链接:http://www.ybtoj.com.cn/problem/763 题目大意 给出\(n\)个点的一棵树,每个\(d_i=0\)的点每秒会产生一个士兵往根节点走,走到一个节点让一个 ...

  10. C#实例:datagridview单元格合并

    这是替C#微信交流群群友做的一个小实例,目的就是在datagridview选择对应行以后,点击button后获取对应行的ip,并执行相应的操作,其实我觉得这样的话button没必要非放置到datagr ...