记录编号 569431 评测结果 AAAAAAAAAA
题目名称 [USACO Open07]牛的进餐 最终得分 100
用户昵称 Gravatarop_组撒头屯 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-03-07 19:48:56 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=400+5;
struct sdf{
    int pt,num;
};
int mp[N][N]={0};
int n,f,d,ans=0;
int pre[N];
int bfs(){
    memset(pre,-1,sizeof(pre));
    queue<sdf>q;
    q.push({0,1<<30});
    pre[0]=0;
    while(!q.empty()){
        int u=q.front().pt,w=q.front().num;
        q.pop();
        if (u==401){
            return w;
        }
        for (int i=0;i<=401;i++){
            if (mp[u][i]>0&&pre[i]==-1){
                int r=min(w,mp[u][i]);
                pre[i]=u;
                q.push({i,r});
            }
        }
    }
    return -1;
}
int main(){
    freopen ("usaco_open07_dining.in","r",stdin);
    freopen ("usaco_open07_dining.out","w",stdout);
    scanf("%d%d%d",&n,&f,&d);
    for (int i=1;i<=n;i++){
        int f1,d1;
        scanf("%d%d",&f1,&d1);
        for (int j=1;j<=f1;j++){
            int t;
            scanf("%d",&t);
            mp[0][t]=mp[t][100+i]=mp[100+i][200+i]=1;
        }
        for (int j=1;j<=d1;j++){
            int t;
            scanf("%d",&t);
            mp[200+i][300+t]=mp[300+t][401]=1;
        }
    }
    while(true){
        int now=bfs();
        if (now==-1)break;
        ans+=now;
        int pt=401;
        while(pt!=0){
            mp[pre[pt]][pt]-=now;
            mp[pt][pre[pt]]+=now;
            pt=pre[pt];
        }
    }
    printf("%d\n",ans);
    return 0;
}