poj3281
非常非常经典的构图
有二分图学习基础的话,很容易想到这是一个“三分图”的匹配问题
我们将牛,food,drink作为点
为了方便,我们将牛放在中间,每头牛的出边指向drink种类,入边由food指入
建立超级源点指向所有food,超级汇点指向所有drink,
要满足最多的牛,也就是求一个最大流
但注意,如果这样求最大流的话,会经过牛点不止一次(因为牛会有多个入边和多个出边)
所以我们考虑将牛点拆为两个点,中间流量为1,这样就能保证牛只经过1次了
const max=;
var a:array[..,..] of longint;
numh,h,cur,pre:array[..] of longint;
n,t,i,j,m,s,f,d,ans,x:longint; procedure sap;
var i,j,flow,tmp,neck,u,k:longint;
begin
numh[]:=;
u:=;
while h[]<t+ do
begin
if u=t then
begin
i:=;
j:=cur[];
flow:=max;
while i<>t do //其实这个地方多余了,容易知道,瓶颈边的流量一定为1
begin
if flow>a[i,j] then
begin
neck:=i;
flow:=a[i,j];
end;
i:=j;
j:=cur[j];
end;
inc(ans,flow);
i:=;
j:=cur[i];
while i<>t do
begin
dec(a[i,j],flow);
inc(a[j,i],flow);
i:=j;
j:=cur[i];
end;
u:=neck;
end;
k:=-;
for i:= to t do
if (a[u,i]>) and (h[u]=h[i]+) then
begin
k:=i;
break;
end;
if k<>- then
begin
cur[u]:=k;
pre[k]:=u;
u:=k;
end
else begin
dec(numh[h[u]]);
if numh[h[u]]= then break; //GAP优化
tmp:=t+;
for i:= to t do
if (a[u,i]>) then tmp:=min(tmp,h[i]); //更新标号
h[u]:=tmp+;
inc(numh[h[u]]);
if u<> then u:=pre[u];
end;
end;
end; begin
readln(n,m,s);
fillchar(a,sizeof(a),);
t:=*n+m+s+; //计算建图后总点数
for i:= to m do
a[,*n+i]:=;
for i:= to s do
a[*n+m+i,t]:=;
for i:= to n do
a[i,i+n]:=;
for i:= to n do
begin
read(f,d);
for j:= to f do
begin
read(x);
a[*n+x,i]:=;
end;
for j:= to d do
begin
read(x);
a[i+n,*n+m+x]:=;
end;
end;
fillchar(cur,sizeof(cur),);
fillchar(pre,sizeof(pre),);
fillchar(h,sizeof(h),);
fillchar(numh,sizeof(numh),);
sap;
writeln(ans);
end.
这题带给我们两个启示:
拆点和建立超级源汇点是网络流构图的基础而又重要的部分
网络流的建图比较复杂(这题还算简单),要细心检查……;
poj3281的更多相关文章
- POJ3281 Dining —— 最大流 + 拆点
题目链接:https://vjudge.net/problem/POJ-3281 Dining Time Limit: 2000MS Memory Limit: 65536K Total Subm ...
- Dining(POJ-3281)【最大流】
题目链接:https://vjudge.net/problem/POJ-3281 题意:厨师做了F种菜各一份,D种饮料各一份,另有N头奶牛,每只奶牛只吃特定的菜和饮料,问该厨师最多能满足多少头奶牛? ...
- POJ-3281(最大流+EK算法)
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...
- poj3281 Dining
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14316 Accepted: 6491 Descripti ...
- POJ3281 Dining(拆点构图 + 最大流)
题目链接 题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份) 一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整 ...
- POJ3281 Dining 最大流
题意:有f种菜,d种饮品,每个牛有喜欢的一些菜和饮品,每种菜只能被选一次,饮品一样,问最多能使多少头牛享受自己喜欢的饮品和菜 分析:建边的时候,把牛拆成两个点,出和入 1,源点向每种菜流量为1 2,每 ...
- poj3281(最大流)
传送门:Dining 题意:一些牛,一些食物,一些饮料,每头牛都有其喜欢的几种食物和几种饮料,求最多能给多少头牛即找到食物又找到饮料~也就是有多少个 牛---食物---饮料 的匹配,而且满足一一匹配, ...
- poj-3281(拆点+最大流)
题意:有n头牛,f种食物,d种饮料,每头牛有自己喜欢的食物和饮料,问你最多能够几头牛搭配好,每种食物或者饮料只能一头牛享用: 解题思路:把牛拆点,因为流过牛的流量是由限制的,只能为1,然后,食物和牛的 ...
- poj3281构图题
题目大意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份)一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整数是Fi ...
随机推荐
- 用CSS3写的小案例-图片缩放隐藏内容显示
思路分析 (1).搭建界面 (2).鼠标移到图片的时候,放大显示 (3).鼠标移入到当前的li标签里面找到后面的div让其显示出来 <!DOCTYPE html> <html lan ...
- Beaglebone Back学习三(开发环境搭建)
开发环境搭建 1 Ubuntu环境搭建 2 Window环境搭建 3 开发板环境搭建 1 Ubuntu环境搭建 (1)安装必要的网络工具 samba nfs tftp vmware-tools sam ...
- Qt+MinGW+OpenCV开发环境在win7系统下的搭建(最新20140423)
1 搭建环境 (1)联想Y470笔记本电脑,win7操作系统 (2)Qt 5.2.1 Open Source :(Qt Online installer for Window(9MB),即下载页面最上 ...
- C# 将list<>泛型集合 转化为 DataTable
使用案例:将页面easy ui 中datagrid表格中的数据,存成json字符串, 通过ajax和ashx传入C#将string类型的json字符串解析成list<>泛型集合, 由于业务 ...
- Invalid argument supplied for foreach()
将需要被遍历的数组强制转换为数组类型即可 <?php $array = null; foreach((array)$array as $value){ #..code.... } ?>
- 灵光乍现,lua数据绑定
MVVM的核心就是数据驱动,数据驱动的核心就是数据绑定. 我一直在思考,如何使用lua做一个数据绑定的功能,仔细思考一下,数据绑定需要做到的功能很简单,就是当一个数据改变时,能主动回调一个或多个函数就 ...
- EXTJS 4.2 资料 控件之btn设置可否点击
1.下面是一个btn按钮的代码,默认不可以点击 { id: 'skipStep3', disabled: true,//默认不可点击 text: "跳转第三步", handler: ...
- P1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会
裸的强连通 ; type node=record f,t:longint; end; var n,m,dgr,i,u,v,num,ans:longint; bfsdgr,low,head,f:arra ...
- Netty多线程处理机制
技术点描述 本文主要研究NioServerSocketChannelFactory类和NioDatagramChannelFactory类, 以及这两个类的各自作用. 由于基于pipelineFact ...
- 如何正确看待Linq的DistinctBy扩展和ForEach扩展
在微软标准的Linq中,并没有DistinctBy扩展和ForEach扩展,但在平时使用工作中却又经常需要使用到这两个功能,照理来说,微软在Linq中应该包含这两个扩展才对,可事实上为什么并没有呢?本 ...