[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1475

[算法]

首先将方格黑白染色 , 也就是说 , 如果(i + j)为奇数 , 这个点就是黑点 , 否则是白点

那么这个n * n的方格就被分为了两个集合 , 一个是黑点集合 , 一个是白点集合

如果选取一个黑点 , 造成影响的是四方向内的白点

如果选取一个白点 , 造成影响的是四方向内的黑点

考虑首先选取所有的点 , 然后去掉最小代价的点 , 并使方案合法

那么这就是一个最小割的经典模型 :

将源点向所有黑点连流量为权值的边

将所有白点向汇点连流量为权值的边

将所有黑点向四方向内的白点连流量为正无穷的边

求解这个图的最小割即可

时间复杂度 : O(dinic(N , M))

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 110
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int inf = 1e9;
const int dx[] = { , , - , };
const int dy[] = {- , , , }; struct edge
{
int to , w , nxt;
} e[N * N * ]; int n , m , S , T , tot;
int a[N][N];
int dep[N * N] , head[N * N]; template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline bool bfs(int s)
{
queue< int > q;
q.push(s);
memset(dep , , sizeof(dep));
dep[s] = ;
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int i = head[cur]; i; i = e[i].nxt)
{
int v = e[i].to , w = e[i].w;
if (w > && dep[v] == -)
{
dep[v] = dep[cur] + ;
q.push(v);
if (v == T) return true;
}
}
}
return false;
}
inline int dinic(int u , int flow)
{
int rest = flow;
if (u == T)
return flow;
for (int i = head[u]; i && rest; i = e[i].nxt)
{
int v = e[i].to , w = e[i].w;
if (dep[v] == dep[u] + && w > )
{
int k = dinic(v , min(w , rest));
if (!k) dep[v] = ;
rest -= k;
e[i].w -= k;
e[i ^ ].w += k;
}
}
return flow - rest;
}
inline void addedge(int u , int v , int w)
{
++tot;
e[tot] = (edge){v , w , head[u]};
head[u] = tot;
++tot;
e[tot] = (edge){u , , head[v]};
head[v] = tot;
}
inline bool valid(int x , int y)
{
return x >= && x <= m && y >= && y <= n;
} int main()
{ read(m); n = m;
int cnt = ;
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
read(a[i][j]);
cnt += a[i][j];
}
}
S = n * m + , T = S + ;
tot = ;
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
if ((i + j) & )
addedge(S , (i - ) * n + j , a[i][j]);
else addedge((i - ) * n + j , T , a[i][j]);
}
}
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
for (int k = ; k < ; k++)
{
int x = i + dx[k] , y = j + dy[k];
if (valid(x , y) && (i + j) & )
addedge((i - ) * n + j , (x - ) * n + y , inf);
}
}
}
int ans = ;
while (bfs(S))
{
while (int flow = dinic(S , inf)) ans += flow;
}
printf("%d\n" , cnt - ans); return ;
}

[BZOJ 1475] 方格取数的更多相关文章

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

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

  2. BZOJ 1475 方格取数(二分图最大点权独立集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...

  3. bzoj P2045 方格取数加强版【最大费用最大流】

    今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...

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

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

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

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

  6. NOIP200003方格取数

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

  7. vijos 1563 疯狂的方格取数

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

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

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

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

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

随机推荐

  1. vue Syntax Error: Unexpected token {

    > music@1.0.0 dev F:\music\music> node build/dev-server.js > Starting dev server...ERROR Fa ...

  2. Spring HTTP Service

    基于Spring MVC, 使用Http Service Invoke远程调用方法 (参考: http://blog.csdn.net/hanqunfeng/article/details/43031 ...

  3. CString和string头文件

    在使用了MFC库的工程中CString可以直接使用,在没有使用MFC库的工程中加入#include <atlstr.h> 要使用STL里的string,要加入#include <st ...

  4. Nginx 第三方模块的安装以及一致性哈希算法的使用

    Nginx 第三方模块的安装以及一致性哈希算法的使用 第三方模块安装方法总结: 以ngx_http_php_memcache_standard_balancer-master为例 1:解压 到 pat ...

  5. 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver

    在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...

  6. sass的使用(载)

    一.什么是SASSSASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般使 ...

  7. fedora delete openJDK

    博客分类: linux   由于Fedora系统安装的时候会自带OpenJDK,安装完系统后 java -version 会显示  [root@localhost bin]# java -versio ...

  8. Html调用 QQ接口

    <A href="tencent://message/?uin=1805843351&Site=有事Q我&Menu=yes"> <img styl ...

  9. POJ 1195 Mobile phones (二维树状数组)

    Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...

  10. 采用ADM2582E/ADM2587E实现完全半/全双工的RS-485/RS-422接口隔离

    RS-485标准是一种常见的总线架构,其通用性及远距离传输能力使其广泛应用于各种通信接口电路.在多数情况下,由于应用环境的恶劣,需要对RS-485接口采用隔离方案以防止出现接地环路. 对RS-485接 ...