【JZOJ1611】Dining
题目描述
农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食。每一头牛只喜欢吃一些食品和饮料而别的一概不吃。虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。
农夫JOHN做了F (1<=F<=100) 种食品和准备了D(1<=D<=100)种饮料。他有N(1<=N<=100)头牛,现在已经知道他的每头牛是否愿意吃某种食物和喝某种饮料。农夫JOHN想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。
每一件食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃食物2。
输入
第一行: 三个数:N, F和D。
第2..N+1行:每一行有两个数开始F_i和D_i,分别是第i头牛可以吃的食品数和可以喝的饮料数。接下来下F_i个整数是第i头牛可以吃的食品号,再下面的D_i个整数是第i头牛可以喝的饮料号码。
输出
文件输出仅一行为一个整数,表示最多可以喂饱牛的数目。
样例输入
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
样例输出
3
解法
网络流建模:
源点向每个食物连一条容量为1的边;
每头牛拆成两个点xi,yi,这两个点连一条容量为1的边;
这头牛的喜好食物向xi连一条容量为1的边,yi向喜好饮品连一条容量为1的边;
每个饮品向汇点连一条容量为1的边。
检验:
每头牛只能占用一个饮品和食品,所以把牛拆点。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) int(log(x)/log(y))
#define food(x) (1+x)
#define drink(x) (1+m1+x)
#define cow(x) (1+m1+m2+x)
#define cow1(x) (1+m1+m2+n+x)
using namespace std;
const char* fin="ex1611.in";
const char* fout="ex1611.out";
const int inf=0x7fffffff;
const int maxn=1007,maxm=maxn*10;
int n,m1,m2,i,j,k,ans=0;
int num,tot=1,fi[maxn],ne[maxm],la[maxm],va[maxm];
int bz[maxn],cnt[maxn];
void add_line(int a,int b,int c){
tot++;
ne[tot]=fi[a];
la[tot]=b;
va[tot]=c;
fi[a]=tot;
}
void add(int a,int b,int c){
add_line(a,b,c);
add_line(b,a,0);
}
int gap(int v,int flow){
int i,use=0,k;
if (v==num) return flow;
for (k=fi[v];k;k=ne[k])
if (va[k] && bz[v]==bz[la[k]]+1){
i=gap(la[k],min(va[k],flow-use));
use+=i;
va[k]-=i;
va[k^1]+=i;
if (use==flow || bz[1]==num) return use;
}
if (!--cnt[bz[v]]) bz[1]=num;
cnt[++bz[v]]++;
return use;
}
int main(){
scanf("%d%d%d",&n,&m1,&m2);
num=1+m1+m2+n+n+1;
for (i=1;i<=n;i++){
int iiii;
add(cow(i),cow1(i),1);
scanf("%d",&j);
scanf("%d",&iiii);
for (;j;j--){
scanf("%d",&k);
add(food(k),cow(i),1);
}
for (;iiii;iiii--){
scanf("%d",&k);
add(cow1(i),drink(k),1);
}
}
for (i=1;i<=m1;i++) add(1,food(i),1);
for (i=1;i<=m2;i++) add(drink(i),num,1);
cnt[0]=num;
while (bz[1]<num) ans+=gap(1,inf);
printf("%d",ans);
return 0;
}
启发
通过拆点来限制每头牛的贡献。
【JZOJ1611】Dining的更多相关文章
- 【USACO】Dining
[题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...
- 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP
[BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...
- 【BZOJ】1711: [Usaco2007 Open]Dining吃饭
[算法]最大流 [题解] S连向食物连向牛连向牛‘连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...
- 【SDOI2009】解题汇总
又开了波专题,感觉就和炉石开冒险一样...(说的好像我有金币开冒险似的) /---------------------------------------------/ BZOJ-1226 [SDOI ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
随机推荐
- Python学习之函数(多层函数)、re模块的正则匹配--计算复杂加减乘除
头疼,其实这个程序在我看的视频当中是当做re模块的运用来进行测试的,而到了我这里就成了简化版的了,因为我实在是做吐了,恕小弟无能,只能做简化版的.为何说是简化版呢,因为要求是给的计算式是多层嵌套的小括 ...
- python 中文乱码问
在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854: 2. UTF-8,E59388: 3. GBK,B9FE. 一.python ...
- springmvc 使用了登录拦截器之后静态资源还是会被拦截的处理办法
解决办法 在拦截器的配置里加上静态资源的处理 参考https://www.jb51.net/article/103704.htm
- Docker Tomcat部署
1.下载tomcat镜像 docker pull tomcat 2.上传项目 /etc/tomcat/webapps/ 3.启动tomcat容器 docker run -d --name tomcat ...
- 洛谷P1456Monkey King
洛谷P1456 Monkey King 题目描述 Once in a forest, there lived N aggressive monkeys. At the beginning, they ...
- 【洛谷】P1880 石子合并
P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计 ...
- GYM 101981E(开关反转性质)
要点 做法是删去连续的k个0或k个1,连消.消消乐的那种,网上博主用个栈\(O(n)\)就很优秀地操作了这个过程 原因是有性质:比如k=3,101000贪心地翻就能翻成000101,所以连续的k个可以 ...
- angular.module()创建、获取、注册angular中的模块
// 传递参数不止一个,代表新建模块;空数组代表该模块不依赖其他模块 var createModule = angular.module("myModule", []); // 只 ...
- mybatis官网文档mybatis_doc
在平时的学习中,我们可以去参考官网的文档来学习,这个文档有中文的,方便我们去阅读,而且这里的分类很详细. 官网文档链接:http://www.mybatis.org/mybatis-3/zh/inde ...
- 说说a标签的onclick和href
在平时我们一般会在列表中的最后一列给加上操作功能,一般的操作功能是修改和删除,这个操作我们可以通过a标签来实现其功能. <a class="pn-opt" href=&quo ...