Dining

原创 2015年11月18日 20:04:29

题目

农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食。每一头牛只喜欢吃一些食品和饮料而别的一概不吃。虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。
  农夫JOHN做了F (1<=F<=100) 种食品和准备了D(1<=D<=100)种饮料。他有N(1<=N<=100)头牛,现在已经知道他的每头牛是否愿意吃某种食物和喝某种饮料。农夫JOHN想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。
  每一件食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃食物2。

分析

很明显的约束条件,我们可以往网络流的方向想
我们会想到每次流出的值都是一种合法的方案,所以我们便可以接着往这个方向去想。
我们会发现若是源点向牛连边,那么我们不能够把饮料和食物连在一起,所以我们可以考虑把牛放在中间,旁边连一些饮料和食物。实际上也是这样的:
我们从源点向饮料连容量为1的边,再把每头牛拆成两个点x,x’。对于它喜欢的饮料i,和食物j,我们可以这样连边:(i->x,1)(x->x’,1)(x’->j,1),这样便可以跑最大流了。

var
    nu,i,n,m,k,x,x1,x2,ans,p,s,ni,tu,j:longint;
    b,last,next,f,re,h,vh:array[0..100000] of longint;
procedure insert(x,y,z:longint);
begin
    inc(nu);b[nu]:=y;next[nu]:=last[x];last[x]:=nu;f[nu]:=z;re[nu]:=nu+1;
    inc(nu);b[nu]:=x;next[nu]:=last[y];last[y]:=nu;f[nu]:=0;re[nu]:=nu-1;
end;
function min(l,r:longint):longint;
begin
    if l<r then exit(l);exit(r);
end;
function sap(x,y:longint):longint;
var p,t,minh:longint;
begin
    if x=tu then exit(y);
    p:=last[x];minh:=ni+1;
    while p<>0 do begin
       if f[p]>0 then begin
          if h[x]=h[b[p]]+1 then begin
             t:=sap(b[p],min(y,f[p]));
             if t>0 then begin
                f[p]:=f[p]-t;
                f[re[p]]:=f[re[p]]+t;
                exit(t);
             end;
             if h[0]>ni then exit(0);
          end;
          minh:=min(minh,h[b[p]]+1);
       end;
       p:=next[p];
    end;
    dec(vh[h[x]]);
    if vh[h[x]]=0 then h[0]:=ni+1;
    h[x]:=minh;
    inc(vh[h[x]]);
    exit(0);
end;
begin
    readln(n,m,k);
    for i:=1 to n do begin
        read(x1,x2);insert(m+i,i+m+n,1);
        for j:=1 to x1 do begin
            read(x);insert(x,m+i,1);
        end;
        for j:=1 to x2 do begin
            read(x);insert(n+m+i,n+m+n+x,1);
        end;
    end;
    s:=0;tu:=n+m+k+1+n;ni:=n+m+k+2+n;
    for i:=1 to m do insert(0,i,1);
    for i:=1 to k do insert(i+m+n+n,tu,1);
    vh[0]:=ni;
    while h[0]<=ni do
    ans:=ans+sap(0,maxlongint);
    writeln(ans);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

【BZOJ1711】[Usaco2007 Open]Dining吃饭【最大流】

【题目链接】 同【POJ3281题解】 /* Pigonometry */ #include #include using namespace std; const int maxn ...
  • BraketBN
  • BraketBN
  • 2016年04月04日 22:07
  • 431

Dining POJ - 3281 Dining 拆点+最大流

传送门:POJ3281 题意:有N头牛,F种食物和D种饮料,每头牛都有各自喜欢的食物和饮料,每种饮料或食物只能分配给一头牛,问最多有多少头牛能同时得到自己喜欢的食物和饮料。 思路:一开始把饮料和食...
  • lxy767087094
  • lxy767087094
  • 2017年06月16日 00:05
  • 143

解题报告 之 POJ3281 Dining

解题报告 之 POJ 3281 Dining 最大流 经典构图 牛吃草问题 食物 饮料 最大分配
  • maxichu
  • maxichu
  • 2015年04月22日 09:28
  • 1020

POJ 3281 Dining(最大流)

POJ 3281 Dining(最大流) http://poj.org/problem?id=3281 题意:        有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食...
  • u013480600
  • u013480600
  • 2014年08月27日 16:35
  • 740

poj3281 Dining-网络流最大流-多对一的匹配

poj3281 Dining Cows are such finicky eaters. Each cow has a preference for certain foods and drinks,...
  • ly59782
  • ly59782
  • 2016年10月18日 14:24
  • 230

BZOJ1711 [Usaco2007 Open]Dining吃饭 题解&代码

题意: 有N头牛,F种食物和D种饮料,每头牛有多种喜欢的食物和饮料,每头牛只可以吃一种食物和饮料,且每种食物和饮料都只能被一头牛吃掉。一头牛满意当且仅当它吃到满意的食物并且喝到想喝的饮料,问最多可能...
  • Rainbow6174
  • Rainbow6174
  • 2016年06月13日 20:06
  • 515

poj3281 - Dining

想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410                                ...
  • wangjian8006
  • wangjian8006
  • 2012年09月01日 20:35
  • 3406

哲学家进餐问题(dining philosopher problem)

很好的解释了计算机系统中的死锁和饿死的问题
  • badbad_boy
  • badbad_boy
  • 2009年03月27日 15:32
  • 1182

POJ 3281-Dining(最大流入门,建图详细解析)

ACM-ICPC 最大流入门题 建图详细解析
  • u010595112
  • u010595112
  • 2014年03月10日 15:10
  • 1066

[POJ 3281] Dining (网络流入门)

POJ - 3281 有 N头牛,F种食物,D种饮料 每种食物和饮料都只有一份 每头牛都只食用固定的几种食物和饮料 问如何安排使得尽量多的牛同时有食物和饮料 这题算是网络流入门题...
  • u012015746
  • u012015746
  • 2016年08月01日 11:29
  • 143
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dining
举报原因:
原因补充:

(最多只允许输入30个字)