记录编号 |
569431 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Open07]牛的进餐 |
最终得分 |
100 |
用户昵称 |
op_组撒头屯 |
是否通过 |
通过 |
代码语言 |
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;
}