zoukankan      html  css  js  c++  java
  • 1711: [Usaco2007 Open]Dingin吃饭

    1711: [Usaco2007 Open]Dingin吃饭

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 560  Solved: 290
    [Submit][Status][Discuss]

    Description

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

    Input

    * 第一行: 三个数: N, F, 和 D

    * 第2..N+1行: 每一行由两个数开始F_i 和 D_i, 分别是第i 头牛可以吃的食品数和可以喝的饮料数.下F_i个整数是第i头牛可以吃的食品号,再下面的D_i个整数是第i头牛可以喝的饮料号码.

    Output

    * 第一行: 一个整数,最多可以喂饱的牛数.

    Sample Input

    4 3 3
    2 2 1 2 3 1
    2 2 2 3 1 2
    2 2 1 3 1 2
    2 1 1 3 3

    输入解释:

    牛 1: 食品从 {1,2}, 饮料从 {1,2} 中选
    牛 2: 食品从 {2,3}, 饮料从 {1,2} 中选
    牛 3: 食品从 {1,3}, 饮料从 {1,2} 中选
    牛 4: 食品从 {1,3}, 饮料从 {3} 中选

    Sample Output

    3
    输出解释:

    一个方案是:
    Cow 1: 不吃
    Cow 2: 食品 #2, 饮料 #2
    Cow 3: 食品 #1, 饮料 #1
    Cow 4: 食品 #3, 饮料 #3
    用鸽笼定理可以推出没有更好的解 (一共只有3总食品和饮料).当然,别的数据会更难.

    HINT

     

    Source

    Gold

    题解:惊现传说中的三分图匹配QAQ

    类似二分图匹配,建立网络图——将S和食物连,T和饮料连,将每只牛拆成X和X',两个点之间连,然后X和对应的食物连,X‘和对应的饮料连,然后构图完毕,上sap,然后还要submit一下才能AC哦QAQ

    (由于第一次写三分图,所以逗比了一下,忘了对于每只牛建立两个点TT,要注意哦么么哒)

     1 type
     2     point=^node;
     3     node=record
     4                g,w:longint;
     5                next,anti:point;
     6     end;
     7 var
     8    i,j,k,l,m,n,t,a1,a2,a3,a4,s,ans:longint;
     9    a:array[0..10000] of point;
    10    d,dv:array[0..10000] of longint;
    11 function min(x,y:longint):longint;inline;
    12          begin
    13               if x<y then min:=x else min:=y;
    14          end;
    15 procedure add(x,y,z:longint);inline;
    16           var p:point;
    17           begin
    18                new(p);p^.g:=y;p^.w:=z;p^.next:=a[x];a[x]:=p;
    19                new(p);p^.g:=x;p^.w:=0;p^.next:=a[y];a[y]:=p;
    20                a[x]^.anti:=a[y];a[y]^.anti:=a[x];
    21           end;
    22 function dfs(x,flow:longint):longint;inline;
    23          var p:point;k:longint;
    24          begin
    25               if x=t then exit(flow);
    26               p:=a[x];dfs:=0;
    27               while p<>nil do
    28                     begin
    29                          if (d[x]=(d[p^.g]+1)) and (p^.w>0) then
    30                             begin
    31                                  k:=dfs(p^.g,min(flow-dfs,p^.w));
    32                                  dec(p^.w,k);
    33                                  inc(p^.anti^.w,k);
    34                                  inc(dfs,k);
    35                                  if dfs=flow then exit;
    36                             end;
    37                          p:=p^.next;
    38                     end;
    39               if d[s]=n then exit;
    40               dec(dv[d[x]]);
    41               if dv[d[x]]=0 then d[s]:=n;
    42               inc(d[x]);inc(dv[d[x]]);
    43          end;
    44 begin
    45      readln(n,m,t);
    46      for i:=1 to m+n+t+2 do a[i]:=nil;
    47      for i:=1 to n do add(1+m+i,1+n+m+i,1);
    48      for i:=1 to m do add(1,1+i,1);
    49      for i:=1 to t do add(1+n+n+m+i,n+n+m+t+2,1);
    50      for i:=1 to n do
    51          begin
    52               read(k,l);
    53               for j:=1 to k do
    54                   begin
    55                        read(a1);
    56                        add(1+a1,1+m+i,1);
    57                   end;
    58               for j:=1 to l do
    59                   begin
    60                        read(a1);
    61                        add(1+m+n+i,1+m+n+n+a1,1);
    62                   end;
    63               readln;
    64          end;
    65      s:=1;t:=n+n+m+t+2;n:=n+n+m+t+2;
    66      ans:=0;
    67      fillchar(d,sizeof(d),0);
    68      fillchar(dv,sizeof(dv),0);
    69      dv[0]:=n;
    70      while d[s]<n do inc(ans,dfs(s,maxlongint));
    71      writeln(ans);
    72      readln;
    73 end.   
  • 相关阅读:
    如何选择一款程序员理想中的显示器
    群英论道聚北京,共话PostgreSQL
    中国人民大学教授杜小勇:One Size Does not Fit All?
    4个技巧,教你如何用excel绘制出高大上的图表
    容易被误读的IOSTAT
    【Android Studio安装部署系列】四、Android SDK目录和作用分析
    【Android Studio安装部署系列】四、Android SDK目录和作用分析
    【Android Studio安装部署系列】四、Android SDK目录和作用分析
    【Android Studio安装部署系列】四、Android SDK目录和作用分析
    Java框架 面试题总结
  • 原文地址:https://www.cnblogs.com/HansBug/p/4392376.html
Copyright © 2011-2022 走看看