【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 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
随机推荐
- nginx配置后只有根目录首页index.php能访问,其他页面404
只有首页面根目录可以访问,其他页面地址都是404 not found.网上找了半天url重定向,url重写都试了无效,要不就是重定向过多,下图为跳坑历程. location / { #if ($htt ...
- jQuery EasyUI的各历史版本和应用
from:http://blog.sina.com.cn/s/blog_b8be6dc40102xpe6.html 各历史版本下载地址: http://www.jeasyui.com/download ...
- JDK的命令具体解释操作
JDK的命令具体解释1 rmic 功能说明: rmic 为远程对象生成 stub 和 skeleton. 语法: rmic [ options ] package-qualified-class-na ...
- [转]JBOSS4.3关于java.lang.OutOfMemoryError: PermGen space解决方法
vi /jboss/bin/run.bat 找到: set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -XX:MaxPermSize=256m 改为: set J ...
- QL 获取当前日期,年、月、日、周、时、分、秒
?select GETDATE() as '当前日期', DateName(year,GetDate()) as '年', DateName(month,GetDate()) as '月', Date ...
- PNG透明兼容IE6的几种方法
方法一:css方式,写一个属性hack,使用滤镜来解决png在ie6下不兼容的问题. _filter: progid:DXImageTransform.Microsoft.AlphaImageLoad ...
- HTML+CSS实现简单三级菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jenkins配置SVN报错
jenkins配置SVN报错,如图:
- 前端框架之jQuery
一 iQuery是什么 jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team jQuery是继prototype之后又一个优秀的Java ...
- recyclerView布局
http://blog.csdn.net/lmj623565791/article/details/45059587