【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 ...
 
随机推荐
- JSP-案例-商品增删改
			
商品的增删改查 1显示 部分代码 Dao public List<Product> findAllProduct() throws SQLException { QueryRunner r ...
 - 2019-1-29-Roslyn-使用-WriteLinesToFile-解决参数过长无法传入
			
title author date CreateTime categories Roslyn 使用 WriteLinesToFile 解决参数过长无法传入 lindexi 2019-01-29 16: ...
 - 2019-8-31-C#-程序集数量对软件启动性能的影响
			
title author date CreateTime categories C# 程序集数量对软件启动性能的影响 lindexi 2019-08-31 16:55:58 +0800 2018-10 ...
 - 跟我一起做一个vue的小项目(八)
			
接下来我们进行的是城市选择页面的路由配置 添加city.vue,使其点击城市,然后跳转到city页面 //router.js import Vue from 'vue' import Router f ...
 - Laravel使用EasyWechat 进行微信支付
			
微信支付和EasyWeChat这个包都是巨坑, 文档写的稀烂, 记录下防止以后又重复踩坑: 安装教程在这: https://www.jianshu.com/p/82d688e1fd2a
 - COOK50小结
			
题目链接 很遗憾.看到第五题的通过人数就不敢做了.待日后补上. A题 求最长的连续子序列,使得他们满足gcd为1. 如果有相邻的两个数的gcd为1,那么整个序列的gcd值也就是1, 否则就是该序列不存 ...
 - vmware 安装 黑群晖
			
先做一个启动盘 然后竟然启动不了 算了 不管了,去网上找个别人做好的吧 添加硬盘的时候,需要选择sata, 比如安装6.2需要这个版本的引导,就直接选中这个,因为我自己做的启动盘不管用,也不知道为嘛 ...
 - CSS 定位 (Positioning)
			
CSS 定位 (Positioning) 属性允许你对元素进行定位. CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多 ...
 - CSS Reset(CSS重置)
			
CSS Reset是指重设浏览器的样式.在各种浏览器中,都会对CSS的选择器默认一些数值,譬如当h1没有被设置数值时,显示一定大小. 但并不是所有的浏览器都使用一样的数值,所以有了CSS Reset, ...
 - 使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决
			
应用场景 我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力.在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Red ...