HDU-1569 方格取数(2) 最小割最大流

  题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩。所以要运用的最小割最大流的思想来解这道题。

  大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得这N个独立的(不相邻)点集的和最大。我们可以将问题转化为最小割来求解。首先,我们将方格进行黑白相间的染色,然后再将任意一种颜色(黑色)作为源点,一种颜色(白色)作为汇点。我们的算法过程就是一个不断寻找增广路的过程。当我们找到最大流的时,也就是此时不存在从黑色到白色的路径,也即不存在不相邻的两个方格能够连通了。而此时的最大流就是分割两个区间的最小割,拿总合值减去这个最小割就是我们想要得到的结果。  

代码如下:

#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#define RE(x) (x)^1
#define INF 0x3fffffff
#define MAXN 50
using namespace std;int N, M, dis[MAXN*MAXN+10], head[MAXN*MAXN+10], idx, source, sink;
int G[MAXN+10][MAXN+10];int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};struct Edge
{int v, cap, next;
}e[200000];void init()
{idx = -1;source = N*M, sink = N*M+1;memset(head, 0xff, sizeof (head));
}int to(int x, int y)
{return (x-1)*M+y-1;
}void insert(int a, int b, int c)
{++idx;e[idx].v = b, e[idx].cap = c;e[idx].next = head[a], head[a] = idx;
}bool judge(int x, int y)
{if (x < 1 || x > N || y < 1 || y > M) {return false;}else {return true;}
}bool bfs()
{int u;queue<int>q;memset(dis, 0xff, sizeof (dis));dis[source] = 0;q.push(source);while (!q.empty()) {u = q.front();q.pop();for (int i = head[u]; i != -1; i = e[i].next) {if (dis[e[i].v] == -1 && e[i].cap > 0) {dis[e[i].v] = dis[u] + 1;q.push(e[i].v);}}}return dis[sink] != -1;
}int dfs(int u, int flow)
{if (u == sink) {return flow;}int tf = 0, sf;for (int i = head[u]; i != -1; i = e[i].next) {if (dis[u]+1 == dis[e[i].v] && e[i].cap > 0 && (sf = dfs(e[i].v, min(flow-tf, e[i].cap)))) {e[i].cap -= sf, e[RE(i)].cap += sf;tf += sf;if (tf == flow) {return flow;}}}if (!tf) {dis[u] = -1;}return tf;
}int Dinic()
{int ans = 0;while (bfs()) {ans += dfs(source, INF);}return ans;
}int main()
{int sum;while (scanf("%d %d", &N, &M) == 2) {sum = 0;init();for (int i = 1; i <= N; ++i) {for (int j = 1; j <= M; ++j) {scanf("%d", &G[i][j]);sum += G[i][j];}}for (int i = 1; i <= N; ++i) {for (int j = 1; j <= M; ++j) {if (!((i+j)&1)) {  
                    insert(source, to(i, j), G[i][j]);insert(to(i, j), source, 0);for (int k = 0; k < 4; ++k) {int xx = i+dir[k][0], yy = j+dir[k][1];  if (judge(xx, yy)) {insert(to(i, j), to(xx, yy), G[i][j]);insert(to(xx, yy), to(i, j), 0);}}} else {insert(to(i, j), sink, G[i][j]);insert(sink, to(i, j), 0);}}}printf("%d\n", sum - Dinic());}return 0;
}

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

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

相关文章

通俗易懂的讲SOA

<微服务设计>1.3节&#xff1a;SOA是一种设计方法&#xff0c;其中包含多个服务&#xff0c;而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用&#xff0c;而非采用进程内调用的方式。 通俗易懂的讲SOA …

PCI总线原理(二)

http://blog.c114.net/html/15/562315-75227.html PCI即Peripheral Component Interconnect&#xff0c;中文意思是“外围器件互联”&#xff0c;是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛&#xff0c;下面我详细介绍…

Windows环境中在同一个Tomcat下发布不同端口号的不同web程序

一、修改Tomcat路径下的conf文件下的 server.xml 文件。增加一个service 节点。 原service节点如下图所示&#xff1a; 新增service节点如下图所示&#xff0c;注意红色标注的是要修改的地方&#xff1a; 二、根据service.xml配置文件信息中对应的Engine节点的name属性&#…

java开发_Runtime

在java中经常需要获取一些系统信息&#xff0c;如系统的资源空间等。下面就是一些Runtime的应用&#xff1a; 1 public static void main(String[] a){2 Runtime runtime Runtime.getRuntime();3 long freeMemoery runtime.freeMemory();4 long tota…

Mybatis逆向工程自动生成代码文件

一般来说都会新建另外一个项目&#xff0c;用于生成代码文件&#xff0c;然后拷贝到需要的项目中。新建maven项目用于生成代码文件&#xff0c;项目目录如下所示&#xff1a; pom.xml内容如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" x…

LAMP平台架构浅析

LAMP是一个缩写&#xff0c;它指一组常用于来搭建动态网站或者服务器的开源软件&#xff0c;包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;PHP、Perl或者 Python编程语言(本文以php为例)。 下面就介绍一下如何基于rpm包的形式…

流程工业MES特点

流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主要通过对原料的混合、反应、分离、粉碎、加热等物理或化学的变化&#xff0c;是原料增值。 流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主…

掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。Android作为一种优秀的、承袭Linux的移动操作系统&#xff0c;其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。进程和线程的基本概念 当一个应用程序开始运行…

高温津贴:关键是消除劳动者“权利贫困”

每年6月至10月期间&#xff0c;劳动者从事露天岗位工作以及用人单位不能采取有效措施将作业场所温度降低到33℃以下的&#xff0c; 用人单位应当按月向劳动者发放高温津贴&#xff0c;违反者处 2000 元以上 10000 元以下罚款。 据报道&#xff0c;目前广州一些建筑工地、搬家公…

Log4j.properties的简单配置

一、首先导入jar包&#xff1a;log4j-1.2.17.jar 二、新增log4j.properties配置文件并输入以下内容&#xff1a; 三、在测试代码总中进行测试&#xff1a; Service public class CKKuCunServiceImpl implements CKKuCunService{Autowiredpublic CKKuCunMapper ckKuCunMapper;…

oracle中保留2位小数的写法

select to_char(1.5678,99.99) from dual 输出&#xff1a;1.57 select to_char(1.5,00.00) from dual 输出&#xff1a;01.50

C#中事务的简单使用

在C#中开启事务的步骤 一、调用SqlConnection对象的BeginTransaction()方法&#xff0c;创建一个SqlTransaction对象&#xff0c;标志事务开始。 二、将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 三、调用相应的方法执行SqlCommand命令。 四、调…

建立openstack quantum开发环境 .

建立openstack quantum开发环境 作者&#xff1a;张华 发表于&#xff1a;2012-4-6 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

使用Jquery插件bTabs实现多页签打开效果

官网地址&#xff1a;点击这里进入官网 资源导入 <link rel"stylesheet" href"b.tabs.css" type"text/css"> <!-- 插件核心脚本 --> <script type"text/javascript" src"b.tabs.js" ></script> &l…

体验Office 2013预览版

微软目前刚发布新版本的office2013,暂时没有中文版。Windows 8下搭配64位office 2013效果非常不错&#xff0c;具体浏览下方的视频。 X86&#xff08;32位&#xff09; 英文版&#xff1a;http://care.dlservice.microsoft.com/download/4/7/1/4712B4E1-4DD9-4468-B8A4-507D7F9…

iframe父页面与子页面之间的元素获取与方法调用

JS 父页面调用子页面子页面调用父页面元素window.frames[iframe的name属性值];① window.parent.document.getElementById("父页面元素ID"); ②window.parent.document.getElementsByTagName("父页面元素标签名")[i]; ③window.parent.document.getElement…

网络营销第四课:网络营销需要掌握的网页代码(2)

1、<hr>水平线标记&#xff1a;<HTML> <HEAD> <TITLE>HR的用法</TITLE> </HEAD> <BODY> <H3>插画中国论坛:漫画 卡通 吉祥物 游戏 海报(原创) </H3> <HR size 15 align left width 80%> <HR color"…

PDA手持终端WinCE系统连接SqlServer数据库

引言&#xff1a;因项目需求需要通过使用PDA手持终端对条码进行数据采集&#xff0c;并将数据传输到SqlServer进行增删改查操作&#xff0c;一般来说&#xff0c;跟sqlserver的版本没有特别大的关系&#xff0c;我见过用05的、08的、我自己用的2014版本。PDA用的是基恩士的&…

一些算法题,欢迎来改进

第一题&#xff0c;关键字&#xff1a;字符串翻转 Reverse the words in a given English sentence (string) in C or C without requiring a separate buffer to hold the reversed string (programming) For example: Input: REALLY DOGSDISLIKE MONKEYSOutput: MONKEYS DIS…