zoukankan      html  css  js  c++  java
  • Bzoj1711 [Usaco2007 Open]Dining吃饭

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 872  Solved: 459

    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

    最大流问题。

    超起点向食物连边,食物向牛连边,牛分成入点和出点,入点连食物,出点向饮料连边,饮料向超汇点连边。

    ↑Dinic求最大流.

     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 const int mxn=3000;
     5 struct edge{
     6     int v,nxt,f;
     7 }e[mxn<<2];
     8 int hd[mxn],mct=1;
     9 int n,f,d;
    10 int S,T;
    11 int read(){
    12     int x=0,f=1;char ch=getchar();
    13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 void add_edge(int u,int v,int c){
    18     e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=c;hd[u]=mct;return;
    19 }
    20 int dep[mxn];
    21 int q[mxn*10];
    22 int hed,tl;
    23 bool BFS(){
    24     memset(dep,0,sizeof dep);
    25     dep[S]=1;hed=0;tl=1;
    26     q[++hed]=S;
    27     while(hed<=tl){
    28         int u=q[hed++];
    29         for(int i=hd[u];i;i=e[i].nxt){
    30             int v=e[i].v;
    31             if(!dep[v] && e[i].f){
    32                 dep[v]=dep[u]+1;
    33                 q[++tl]=v;
    34             }
    35         }
    36     }
    37     return dep[T];
    38 }
    39 int DFS(int u,int lim){
    40     if(u==T) return lim;
    41     int tmp,f=0;
    42     for(int i=hd[u];i;i=e[i].nxt){
    43         int v=e[i].v;
    44         if(dep[v]==dep[u]+1 && e[i].f){
    45             tmp=DFS(v,min(lim,e[i].f));
    46             lim-=tmp;
    47             f+=tmp;
    48             e[i].f-=tmp;
    49             e[i^1].f+=tmp;
    50             if(!lim)return f;
    51         }
    52     }
    53     return f;
    54 }
    55 int Dinic(){
    56     int res=0;
    57     while(BFS())res+=DFS(S,1e9);
    58     return res;
    59 }
    60 int main()
    61 {
    62     int i,j,a,b,u,v;
    63     n=read();f=read();d=read();
    64     S=0;T=n+n+f+d+1;
    65     int sd=f+n+n;
    66     for(i=1;i<=n;i++){
    67         a=read();b=read();
    68         for(j=1;j<=a;j++){//食品 
    69             u=read();
    70             add_edge(u,f+i,1);
    71             add_edge(f+i,u,0);
    72         }
    73         for(j=1;j<=b;j++){//饮料 
    74             u=read();
    75             add_edge(f+i+n,sd+u,1);
    76             add_edge(sd+u,f+i+n,0);
    77         }
    78         add_edge(f+i,f+i+n,1);
    79         add_edge(f+i+n,f+i,0);
    80     }
    81     for(i=1;i<=f;i++){
    82         add_edge(S,i,1);
    83         add_edge(i,S,0);
    84     }
    85     for(i=1;i<=d;i++){
    86         add_edge(sd+i,T,1);
    87         add_edge(T,sd+i,0);
    88     }
    89     int ans=Dinic();
    90     printf("%d
    ",ans);
    91     return 0;
    92 }
  • 相关阅读:
    iOS 数字滚动 类似于老
    iOS 实现转盘的效果
    iOS 摇一摇的功能
    APP上架证书无效:解决
    iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
    ios 获取字符串所需要占用的label的高度
    适配----Autolayout
    OC中 block 的用法
    微信小程序如何播放腾讯视频?
    IOS-UICollectionView
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6126969.html
Copyright © 2011-2022 走看看