这几天刚学了费用流,找到了这道题来练一练手。

  题目:

题目描述 Description

假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。

输入描述 Input Description

第一行为两个整数F,V(F<=V<=100)

接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。

输出描述 Output Description

一个整数,即最大美学值。

样例输入 Sample Input

2 2

10 0

5 2

样例输出 Sample Output

12


  这道题很明显是二分图的最大权匹配,可以用最大费用最大流来做。做法:首先先建图,在源点到每束花之间连一条流量为1,花费0为的点(每束花只能用一次),在每个花屏到汇点之间连一条流量为1,花费为0的边(每个花瓶只能用一次),然后再在每束花和每个花瓶之间连一条流量为1,权值为这种匹配的美学值的边;然后就用spfa找增广路,建反向边时,反向边的流量是这条增广路的流量,花费是原边的花费的相反数。

  一开始写的时候受了最大流的影响,也像最大流那样建了分层图,于是WA了两次也找不出错。后来把分层图删掉才能AC。其实分层图的作用就是避免出现环造成死循环,而用spfa来找增广路,就已经避免了这个问题,反而会把原图中的一些边删掉,所以费用流中千万不要用分层图

  代码:

var a,c:array[..,..]of longint;//a是原图,c是花费的图
fa,d:array[..]of longint;//fa[i]是在到i的最短路径上i的前一个点(前驱结点),d[i]是到i的最短路径的距离
b:array[..]of boolean;//记录是否在队列中
q:array[..]of longint;//队列
n,m,i,j,k,p,t,h,sum:longint;
procedure spfa(s:longint);//spfa模板
var i,h,t:longint;
begin
for i:= to n do begin
d[i]:=-<<; b[i]:=true;//初始化
end;
h:=; t:=; q[]:=s; d[s]:=; b[s]:=false; fa[s]:=-;//初始化2
repeat
for i:= to n do
if(a[q[h],i]>)and(d[q[h]]+c[q[h],i]>d[i])then begin//判断是否有边,是否更优
d[i]:=d[q[h]]+c[q[h],i]; fa[i]:=q[h];//更新距离
if b[i] then begin
inc(t); q[t]:=i; b[i]:=false;//入队
end;
end;
b[q[h]]:=true; inc(h);//出队
until h>t;
end;
function flow(s,t:longint):longint;
var p,min:longint;
begin
spfa(s);
if d[t]=-<< then exit();//判断是否有增广路
p:=t; min:=<<;
while fa[p]>= do begin
if min>a[fa[p],p] then min:=a[fa[p],p];//从汇点访问到源点,计算流量
p:=fa[p];
end;
p:=t;
while fa[p]>= do begin
c[p,fa[p]]:=-c[fa[p],p];//建反向边1
a[fa[p],p]:=a[fa[p],p]-min; a[p,fa[p]]:=a[p,fa[p]]+min;//建反向边2
p:=fa[p];
end;
sum:=sum+d[t];//加上这次增广的花费,更新答案
exit(min);
end;
begin
read(n,m);
for i:= to n do begin
a[,i]:=; c[,i]:=;//建图1
end;
for i:= to m do begin
a[i+n,n+m+]:=; c[i+n,n+m+]:=;//建图2
end;
for i:= to n do
for j:= to m do begin
read(k); a[i,n+j]:=; c[i,n+j]:=k;//建图3
end;
n:=n+m+; sum:=; k:=;
while k> do k:=flow(,n);//一行费用流
writeln(sum);//输出最大美学值
end.

【codevs1028】花店橱窗布置(费用流)的更多相关文章

  1. codevs1028花店橱窗布置(费用流)

    这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...

  2. [IOI1999]花店橱窗布置(DP路径记录)

    题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...

  3. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  4. RQNOJ PID496/[IOI1999]花店橱窗布置

    PID496 / [IOI1999]花店橱窗布置 ☆   题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号 ...

  5. 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)

    花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...

  6. codevs 1028 花店橱窗布置

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整 ...

  7. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...

  8. wikioi 1028 花店橱窗布置 最大权匹配

    中文题意不描述. 链接:http://wikioi.com/problem/1028/ 这题一开始很裸的最大权二分匹配.但是原来没有接触过,KM的这个最大权不大会.然后一开始以为用最大费用最大流直接就 ...

  9. [动态规划]P1854 花店橱窗布置

    题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...

随机推荐

  1. 7、easyui 表单

    这是最后一个小节了,后面将会使用一个小项目来进一步实用讲解: 在之前的什么相关只是点都以及讲过了或者说涉及到过,如datagrid表格,树形菜单,布局面板panel,页签,拖放功能,只是在表格的属性细 ...

  2. ADODB

    转自网友,看着挺全就转了,供大家学习研究. Recordset 对象的属性1.CursorType 属性AdOpenForwardOnly: 仅向前游标,默认值.除了只能在记录中向前滚动外,与静态游标 ...

  3. [转]libevent 环境配置

    libevent 据说是IO复用的好东西.所以今天来耍耍. 1. 从官网下载源代码:http://libevent.org/,最新的版本已达到2.0. 2. 先把ubuntu系统自带的libevent ...

  4. 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)

    [BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...

  5. view {display:block}

    view {display:block}

  6. Js slice()方法和splice()方法

    1.slice(start,end) 从已有的数组中返回选定元素,参数start必填,end选填 <script> delArray(); function delArray(){ var ...

  7. 我的Android进阶之旅------>Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  8. vb.net 正則表達式 取 固定格式的字符

    vb.net 正則表達式 取 固定格式的字符: 原始字符串:strSqlTmp="select * from A_TEST where a_data = '@1@' and b_link = ...

  9. Linux中的自定义变量

    范围: 只在当前Shell中生效 语法: 变量定义: name="xiaol" hello="$name"" hello" 变量调用: ec ...

  10. Matlab mser(最大极值稳定区域)

    在Matlab R2013a 和R2014a中已经实现MSER特征的提取. 一.函数detectMSERFeatures 输入的是M*N的灰度图片.可以指定阈值刻度,区域范围,感兴趣区域等参数. 输出 ...