【codevs1028】花店橱窗布置(费用流)
这几天刚学了费用流,找到了这道题来练一练手。
题目:
假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。
第一行为两个整数F,V(F<=V<=100)
接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。
一个整数,即最大美学值。
2 2
10 0
5 2
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】花店橱窗布置(费用流)的更多相关文章
- codevs1028花店橱窗布置(费用流)
这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- RQNOJ PID496/[IOI1999]花店橱窗布置
PID496 / [IOI1999]花店橱窗布置 ☆ 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号 ...
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- codevs 1028 花店橱窗布置
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整 ...
- AC日记——花店橱窗布置 codevs 1028
题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...
- wikioi 1028 花店橱窗布置 最大权匹配
中文题意不描述. 链接:http://wikioi.com/problem/1028/ 这题一开始很裸的最大权二分匹配.但是原来没有接触过,KM的这个最大权不大会.然后一开始以为用最大费用最大流直接就 ...
- [动态规划]P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
随机推荐
- cocos2d-x之读开发技术精解
引擎位置(依次往下): 游戏App->逻辑与规则->引擎->运行的平台->硬件接口(驱动运行库API) 1. 渲染框架 CCNode绘制基类(引擎核心类都继承于它,形成一个链表 ...
- c语言 常用知识点
强制类型转换 (int)(x+y) 输入 scanf("a=%f,b=%f",&a,&b); a=1,b=1 char a; a=getchar(); 输入一个字 ...
- git 初始化项目操作
命令行指令 Git 全局设置 git config --global user.name "你的名称" git config --global user.email "a ...
- jmeter 响应数据更换显示类型(json、html、text)
.默认情况下是Text格式 2.修改为json格式显示
- webService通过response和request对象传输文件
<code class=" hljs java">package gacl.response.study; 2 3 import java.io.IOException ...
- [转]libevent 环境配置
libevent 据说是IO复用的好东西.所以今天来耍耍. 1. 从官网下载源代码:http://libevent.org/,最新的版本已达到2.0. 2. 先把ubuntu系统自带的libevent ...
- 关于微信小程序的开发步骤
~~~~包子最近在研究小程序 首先先讲一下小程序一些基本的步骤: 1.登录微信的公众平台,选择小程序,注册一个账号,期间有碰到什么交300块钱的就不要理他,因为我只是做demo,当然,准备上线的企业啥 ...
- JS HTML DOM 事件对象(onclick、onmouseenter)
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮). HTML DOM 事件 DOM: ...
- PHP定界符{}的作用
说明: PHP解析一个字符串为"Hello,$World"时会自动解析$World. {}是方便让PHP更快的查找,它告诉PHP这里面就是变量,不用再判断是否是变量了. 例子: $ ...
- 图的遍历:DFS和BFS
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...