【codevs1907】方格取数3(最大流最小割定理)
网址:http://codevs.cn/problem/1907/
题意:在一个矩阵里选不相邻的若干个数,使这些数的和最大。
我们可以把它看成一个最小割,答案就是矩阵中的所有数-最小割。先把矩阵按国际象棋棋盘黑白染色(即把相邻的点分别染成白色和黑色),然后黑点连源点,白点连汇点。割掉一个点到源/汇的边就是不选择这个点,最后的目的就是使源到汇不连通(不引发题目不能选择位置相邻的数的矛盾)。
然而最小割怎么求呢?
于是我们就要引入一个定理:最大流最小割定理。它的意思就是说,在一个图中,a点到b点的最小割=a到b的最大流。
然而我并不会证……这里口胡一个想法:最大流就是沿着剩余网络不断地流,每流一次相当于删掉剩余网络的一条边,流到不能流为止。而最小割也是不断地割直到不连通。于是最小割=最大流。
答案就这样变成了求最大流。
具体怎么建图,就是把黑/白点到源/汇的边的流量定为这个位置的上数,而黑白点之间的边,因为不能把它割掉,所以把它的流量设为一个极大数。
于是就过了。
代码:
var a:array[..,..]of longint;
s:array[..,..]of longint;
l,q:array[..]of longint;
n,m,nn,i,j,k,h,t:longint;
ans,sum:int64;
function num(x,y:longint):longint;
begin
exit((x-)*m+y);
end;
function dfs(now,ll:longint):longint;
var p,i:longint;
begin
if now=nn then exit(ll);
for i:= to nn do
if(a[now,i]>)and(l[i]=l[now]+)then begin
if a[now,i]<ll then p:=dfs(i,a[now,i])
else p:=dfs(i,ll);
a[now,i]:=a[now,i]-p; a[i,now]:=a[i,now]+p;
if p> then exit(p);
end;
exit();
end;
begin
read(n,m); sum:=;
for i:= to n do
for j:= to m do begin
read(s[i,j]);
sum:=sum+s[i,j];
end;
fillchar(a,sizeof(a),);
for i:= to n do
for j:= to m do
if (i+j)and = then a[num(i,j),n*m+]:=s[i,j]
else begin
if i> then a[num(i,j),num(i-,j)]:=<<;
if i<n then a[num(i,j),num(i+,j)]:=<<;
if j> then a[num(i,j),num(i,j-)]:=<<;
if j<m then a[num(i,j),num(i,j+)]:=<<;
a[,num(i,j)]:=s[i,j];
end;
nn:=n*m+; ans:=;
while true do begin
fillchar(l,sizeof(l),);
h:=; t:=; q[]:=; l[]:=;
repeat
for i:= to nn do
if(a[q[h],i]>)and(l[i]=)then begin
inc(t); q[t]:=i; l[i]:=l[q[h]]+;
end;
inc(h);
until h>t;
if l[nn]= then break;
repeat
k:=dfs(,<<);
ans:=ans+k;
until k=;
end;
writeln(sum-ans);
end.
codevs1907方格取数
【codevs1907】方格取数3(最大流最小割定理)的更多相关文章
- HDU 1569 方格取数(2) (最小割)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- [BZOJ1475]方格取数 网络流 最小割
1475: 方格取数 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1025 Solved: 512[Submit][Status][Discuss] ...
- LuoguP2774 方格取数问题(最小割)
题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...
- codevs1907 方格取数 3
«问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.«编程任务:对于给定的方格棋 ...
- 【bzoj1475】方格取数 网络流最小割
题目描述 在一个n*n的方格里,每个格子里都有一个正整数.从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大. 输入 第一行一个数n:(n<=30) 接下来n行每行n ...
- 洛谷P2774 方格取数问题(最小割)
题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...
- luogu2774 [网络流24题]方格取数问题 (最小割)
常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...
- 线性规划与网络流24题●09方格取数问题&13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午) ●09方格取数问题(codevs1907 方格取数3) 想了半天,也没成功建好图: 无奈下 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
随机推荐
- PHP制作姓名、学号。爱好等窗口
if (radioButton1.Checked == true) textBox2.Text = 姓名: + textBox1.Text + 性别: + radi ...
- Android经常使用工具类DateUtils(二)
在编写代码中,会经经常使用到时间Date这个类,小编整理了一些经常使用的时间工具类.供大家參考. import java.text.ParseException; import java.text.S ...
- Observable观察者模式的使用
今天我们公司封装的类中没有加上Observable观察者模式,但是很多地方需要用到Observable观察者模式 接下来就向大家介绍一下我的使用吧! 在介绍之前我们写了一个方法 public clas ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.2——将Eclipse开发的项目导入到AndroidStudio
问题: 你想要将一个Eclipse ADT项目导入到Android Studio中. 解决方案: Android Studio提供了一个导入向导,可以重写已有的项目. 详细: 在Android Stu ...
- lua(仿单继承)
--lua仿单继承 Account = { balance = } function Account:new(o) o = o or {} setmetatable(o, self)--Account ...
- Unique Encryption Keys
The security of many ciphers strongly depends on the fact that the keys are unique and never re-used ...
- OAuth授权
重新梳理下授权认证模式. OWIN OWIN的英文全称是Open Web Interface for .NET.OWIN是针对.NET平台的开放Web接口. https://blog.csdn.net ...
- FW 执行Git命令时出现各种 SSL certificate problem 的解决办法
比如我在windows下用Git clone gitURL 就提示 SSL certificate problem: self signed certificate 这种问题,在windows下出现 ...
- Docker + ElasticSearch + Node.js
最近有空就想研究下ElasticSearch. 此篇文章用来记录研究过程.备注:需要有一定的docker基础,ElasticSearch的基本概念 Docker安装ElasticSearch 首先,就 ...
- springboot 项目跨域问题 CORS
package com.example.demo.cors; import org.springframework.context.annotation.Bean; import org.spring ...