【bzoj2132】圈地计划 网络流最小割

题目描述

最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益。另外不同的区域连在一起可以得到额外的收益,即如果区域(I,j)相邻(相邻是指两个格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的区域,则这块区域能增加k×Cij收益。经过Tiger.S教授的勘察,收益矩阵A,B,C都已经知道了。你能帮GDOI求出一个收益最大的方案么?

输入

输入第一行为两个整数,分别为正整数N和M,分别表示区域的行数和列数;第2到N+1列,每行M个整数,表示商业区收益矩阵A;第N+2到2N+1列,每行M个整数,表示工业区收益矩阵B;第2N+2到3N+1行,每行M个整数,表示相邻额外收益矩阵C。第一行,两个整数,分别是n和m(1≤n,m≤100);

任何数字不超过1000”的限制

输出

输出只有一行,包含一个整数,为最大收益值。

样例输入

3 3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
1 1 1
1 3 1
1 1 1

样例输出

81


题解

网络流最小割

只考虑相邻的两个,问题转化为:$i$和$j$各有两种选法:选择A可以获得$a_i$或$a_j$的收益;选择B可以获得$b_i$或$b_j$的收益;如果选择不同,则会获得$c_i+c_j$的收益。问最大收益。

这是一个经典的最小割模型,建图方法:S连向i,容量为$a_i$,i连向T,容量为b_i;S连向j,容量为$b_j$,i连向T,容量为$a_j$(这两步是反转源汇的过程)。i和j之间连容量为$c_i+c_j$的双向边。

 

因此总的建图为:黑白染色,黑点正常连,白点反转源汇,然后相邻的点之间连边。答案为$\sum\limits a_i+\sum\limits b_i+\sum\limits(c_i+c_j)-mincut$。

#include <queue>
#include <cstdio>
#include <cstring>
#define N 10010
#define M 1000010
#define pos(i , j) (i - 1) * m + j
using namespace std;
typedef long long ll;
const int inf = 1 << 30;
queue<int> q;
int n , m , head[N] , to[M] , next[M] , cnt = 1 , s , t , dis[N];
ll a[110][110] , b[110][110] , c[110][110] , val[M];
void add(int x , int y , ll z)
{to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
}
ll link(int x1 , int y1 , int x2 , int y2)
{add(pos(x1 , y1) , pos(x2 , y2) , c[x1][y1] + c[x2][y2]);add(pos(x2 , y2) , pos(x1 , y1) , c[x1][y1] + c[x2][y2]);return c[x1][y1] + c[x2][y2];
}
bool bfs()
{int x , i;memset(dis , 0 , sizeof(dis));while(!q.empty()) q.pop();dis[s] = 1 , q.push(s);while(!q.empty()){x = q.front() , q.pop();for(i = head[x] ; i ; i = next[i]){if(val[i] && !dis[to[i]]){dis[to[i]] = dis[x] + 1;if(to[i] == t) return 1;q.push(to[i]);}}}return 0;
}
ll dinic(int x , ll low)
{if(x == t) return low;ll temp = low , k;int i;for(i = head[x] ; i ; i = next[i]){if(val[i] && dis[to[i]] == dis[x] + 1){k = dinic(to[i] , min(temp , val[i]));if(!k) dis[to[i]] = 0;val[i] -= k , val[i ^ 1] += k;if(!(temp -= k)) break;}}return low - temp;
}
int main()
{int i , j;ll ans = 0;scanf("%d%d" , &n , &m) , s = 0 , t = n * m + 1;for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &a[i][j]);for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &b[i][j]);for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &c[i][j]);for(i = 1 ; i <= n ; i ++ ){for(j = 1 ; j <= m ; j ++ ){ans += a[i][j] + b[i][j];if((i & 1) ^ (j & 1)) add(s , pos(i , j) , b[i][j]) , add(pos(i , j) , t , a[i][j]);else{add(s , pos(i , j) , a[i][j]) , add(pos(i , j) , t , b[i][j]);if(i > 1) ans += link(i , j , i - 1 , j);if(i < n) ans += link(i , j , i + 1 , j);if(j > 1) ans += link(i , j , i , j - 1);if(j < m) ans += link(i , j , i , j + 1);}}}while(bfs()) ans -= dinic(s , inf);printf("%lld\n" , ans);return 0;
}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7434706.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础

Linux的特点&#xff1a; 系统版本&#xff1a;常见的有debian、Redhat更适合做服务器&#xff0c;更安全和稳定&#xff0c;Ubuntu唯一的优势就是图形界面好&#xff0c;centos目前被redhat收购&#xff0c;红旗已经倒闭。 1、免费的/开源的&#xff1b;2、支持多线程/多用户&…

yum查询已经安装mysql_通过yum安装mysql

在linux中安装数据库首选MySQL&#xff0c;Mysql数据库的第一个版本就是发行在Linux系统上&#xff0c;其他选择还可以有postgreSQL&#xff0c;oracle等在Linux上安装mysql数据库&#xff0c;我们可以去其官网上下载mysql数据库的rpm包&#xff0c;http://dev.mysql.com/downl…

JAVA命令符找不到符号_[转]Java命令行编译文件时出现的错误,找不到符号或软件包不存在等...

标签(空格分隔)&#xff1a; Javajavascript习惯了eclipse的自动编译&#xff0c;Java命令行编译、执行文件只会最基础的部分&#xff0c;就是对单文件的编译和执行&#xff0c;并且不包含任何外部JAR包。但有时候你还非得用命令行&#xff0c;会碰到一些问题&#xff0c;博主这…

C#中POST数据和接收的几种方式

POST方式提交数据&#xff0c;一种众所周知的方式&#xff1a; html页面中使用form表单提交&#xff0c;接收方式&#xff0c;使用Request.Form[""]或Request.QueryString[""]来获取。 这里介绍另外一种POST方式和接收方式&#xff0c;就是将整个数据作为加…

一卡通vip充值消费线上oracle库服务器故障排查过程

上图是oracle体系总架构图今天突然公司所有终端pos机不能刷卡消费&#xff0c;财务室不能充值&#xff0c;一下很多电话打过来了&#xff0c;第一反应肯定数据库出问题了&#xff0c;登陆到数据库服务器&#xff0c;果然sqlplus连进去后就不断提示要求输入用户名&#xff0c;弹…

数据库学习,树形结构的数据库表Schema设计方案

2019独角兽企业重金招聘Python工程师标准>>> 程序设计过程中&#xff0c;我们常常用树形结构来表征某些数据的关联关系&#xff0c;如企业上下级部门、栏目结构、商品分类等等&#xff0c;通常而言&#xff0c;这些树状结构需要借助于数据库完成持久化。然而目前的各…

Systemd 入门教程之命令篇

Systemd 是 Linux 系统工具&#xff0c;用来启动守护进程&#xff0c;已成为大多数发行版的标准配置。 本文介绍它的基本用法&#xff0c;分为上下两篇。今天介绍它的主要命令&#xff0c;下一篇介绍如何用于实战。 一、由来 历史上&#xff0c;Linux 的启动一直采用init进程。…

GCC生成的汇编代码

假设我们写了一个C代码文件 code.c包含下面代码&#xff1a; int accum 0; int sum(int x, int y) { int t x y; accum t; return t; } 这是用echo命令输入源码的效果&#xff0c;简单的就是最好的&#xff1a;&#xff09;一、查看GCC生成的汇编代码在命令行…

jQuery高度及位置操作

1. 获取滑轮位置&#xff0c;scrolltop:上下滚动的意思。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div style"height:100px;width:10…

you have mixed tabs and spaces fix this

http://blog.csdn.net/tonyyan19781/article/details/60882443Vs2013 IDE下&#xff0c;编辑C的工程源码&#xff0c;在打开文件的时候&#xff0c;会出现 “ you have mixed tabs and spaces fix this ”&#xff0c; 然后给出三个选项 Tabify、Untabify、Dont show again。尤…

30天自制操作系统(二)汇编语言学习与Makefile入门

1 介绍文本编辑器这部分可直接略过2 继续开发helloos.nas中核心程序之前的内容和启动区以外的内容先不讲了&#xff0c;因为还涉及到一些软盘方面的知识。然后来讲的是helloos.nas这个文件; hello-os ; TAB4ORG 0x7c00 ; 指明程序的装载地址; 以下这部分记录…

java房产源码_基于jsp的房屋交易管理系统-JavaEE实现房屋交易管理系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的房屋交易管理系统, 该项目可用各类java课程设计大作业中, 房屋交易管理系统的系统架构分为前后台两部分, 最终实现在线上进行房屋交易管理系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类房屋交易管…

Docker 精通之入门

Docker 精通系列 Docker 精通之入门Docker 精通之微服务Docker 精通之常用命令Docker 精通之 Dockerfile 2013年发布至今&#xff0c; Docker 一直广受瞩目&#xff0c;被认为可能会改变软件行业。 但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问…

bzoj3156 防御准备 - 斜率优化

Input 第一行为一个整数N表示战线的总长度。 第二行N个整数&#xff0c;第i个整数表示在位置i放置守卫塔的花费Ai。 Output 共一个整数&#xff0c;表示最小的战线花费值。 Sample Input 102 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<N<10^6,1<Ai<10^9 这题还是…

Docker 精通之微服务

Docker 精通系列 Docker 精通之入门Docker 精通之微服务Docker 精通之常用命令Docker 精通之 Dockerfile Docker 是一个容器工具&#xff0c;提供虚拟环境。很多人认为&#xff0c;它改变了我们对软件的认识。 站在 Docker 的角度&#xff0c;软件就是容器的组合&#xff1a;业…

php根据浏览器调用支付_Android通过外部浏览器调用微信H5支付,Android+PHP详解

看了好多关于讲解微信H5支付开发的文章&#xff0c;大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付)&#xff0c;可能是因为H5支付接口刚开放不久吧。微信官方体验链接&#xff1a;http://wxpay.wxutil.com/mch/pay/h5.v2.php&#xff0c;请在微信外浏览器打开…

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战1 秒杀业务分析 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b;&#xff08;2&#xff09;创建订单&#xff1b;&#xff08;3&#xff09;扣减库存&#xff1b;&#xff08;4&#xff09;更新订单&#xff1…

如何提高安卓代码的质量和语法

本文讲的是如何提高安卓代码的质量和语法&#xff0c;在这篇文章中&#xff0c;我会介绍几种不同的方式&#xff0c;让你通过自动化工具提高你的Android代码质量&#xff0c;包括 Checkstyle&#xff0c; Findbugs&#xff0c;PMD&#xff0c; 当然&#xff0c;还有我们最熟悉的…

grep 命令的 12 个实例

2019独角兽企业重金招聘Python工程师标准>>> 你是否遇到过需要在文件中查找一个特定的字符串或者样式&#xff0c;但是不知道从哪儿开始&#xff1f;那么,就请grep来帮你吧。 grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因&#xff0c;…

Linux : shell基础(慕课网Linux达人养成计划课程笔记)

Shell概述 shell是Linux中的命令行解释器&#xff0c;为用户提供了一个向Linux内核发送请求一边运行程序的界面系统级程序&#xff0c;用户可以用shell来启动、挂起、停止甚至编写一些程序。shell还是一个功能相当强大的编程语言&#xff0c;易编写&#xff0c;易调试&#xff…