• 网络流


    农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料。每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛。最多能有多少头牛可以同时得到喜欢的食物和饮料?


    Input
    第一行输入三个整数N, F, D
    接下来n行,每行先输入两个整数 Fi 和 Di,分别表示编号为 i 的牛喜欢的食物和饮料的数量,接下来的Fi个整数表示第i头牛喜欢的食物的编号,最后Di个整数表示第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
    Sample Output
    3
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 const int amn=1e6+5;
     7 const int inf=1e9;
     8 int dis[amn],head[amn],n,f,d,tot;
     9 struct node{
    10     int to,next,flow,c;
    11 }edge[amn<<1];
    12 void init(){
    13     memset(head,-1,sizeof(head));
    14     tot=0;
    15 }
    16 void add(int u,int v,int c){
    17     edge[tot].to=v;
    18     edge[tot].flow=c;
    19     edge[tot].next=head[u];
    20     head[u]=tot++;
    21     edge[tot].to=u;
    22     edge[tot].flow=0;
    23     edge[tot].next=head[v];
    24     head[v]=tot++;
    25 }
    26 int bfs(int s,int t){
    27     queue<int> q;
    28     memset(dis,-1,sizeof(dis));
    29     dis[s]=0;
    30     q.push(s);
    31     while(!q.empty()){
    32         int x=q.front();
    33         q.pop();
    34         if(x==t)return 1;
    35         for(int i=head[x];i!=-1;i=edge[i].next){
    36             int v=edge[i].to;
    37             if(edge[i].flow&&dis[v]==-1){
    38                 dis[v]=dis[x]+1;
    39                 q.push(v);
    40             }
    41         }
    42     }
    43     if(dis[t]==-1)return 0;
    44     return 1;
    45 }
    46 int dfs(int s,int flow){
    47     if(s==2*n+d+f+1)return flow;
    48     int ans=0;
    49     for(int i=head[s];i!=-1;i=edge[i].next){
    50         int v=edge[i].to;
    51         if(edge[i].flow&&dis[v]==dis[s]+1){
    52             int f=dfs(v,min(flow-ans,edge[i].flow));
    53             edge[i].flow-=f;
    54             edge[i^1].flow+=f;
    55             ans+=f;
    56             if(ans==flow)return ans;
    57         }
    58     }
    59     return ans;
    60 }
    61 int Dinc(int s,int t){
    62     int flow=0;
    63     while(bfs(s,t)){
    64         flow+=dfs(s,inf);
    65     }
    66     return flow;
    67 }
    68 int main(){
    69     while(~scanf("%d%d%d",&n,&f,&d)){
    70         init();
    71         int s=0,t=2*n+f+d+1;
    72         for(int i=1;i<=f;i++){
    73             add(s,2*n+i,1);
    74         }
    75         for(int i=1;i<=d;i++){
    76             add(2*n+f+i,2*n+f+d+1,1);
    77         }
    78         for(int i=1;i<=n;i++){
    79             add(i,i+n,1);
    80         }
    81         int in,di,fi;
    82         for(int i=1;i<=n;i++){
    83             scanf("%d%d",&fi,&di);
    84             for(int j=1;j<=fi;j++){
    85                 scanf("%d",&in);
    86                 add(2*n+in,i,1);
    87             }
    88             for(int j=1;j<=di;j++){
    89                 scanf("%d",&in);
    90                 add(n+i,2*n+f+in,1);
    91             }
    92         }
    93         printf("%d
    ",Dinc(s,t));
    94     }
    95 }
  • 相关阅读:
    有关于iphone 音频 录制 播发
    iPhone开发之网络编程 AsyncSocket
    在.NET中使用Speex 音频数据编解码
    下面首先来看GCD的使用
    [已解决] AVAudioRecorder 录音,编码问题
    [转](让你少走十年弯路)四十以后才明白
    怎样才算读懂一本书?
    5000个知识点后怎样?
    DIKW体系 个人知识管理领域中最基础的概念
    个人竞争力 每个人必须悟透的概念
  • 原文地址:https://www.cnblogs.com/Railgun000/p/10707102.html
Copyright © 2020-2023  润新知