奶牛食品

Time Limit:10000MS  Memory Limit:65536K

Total Submit:132 Accepted:61

Case Time Limit:1000MS

Description

FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃。某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求。但是FJ又不愿意为此重新来做,所以他他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。

FJ提供了F (编号为1、2、…、F)种食品并准备了D (编号为1、2、…、D)种饮料,他的N头牛(编号为1、2、…、N)都已决定了是否愿意吃某种食物和喝某种饮料。FJ想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。

每一种食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃到食物2。

Input

第一行包含三个用空格分开的整数N,F和D;

接下来的N行描述每个奶牛的信息:

第i+1行的前两个整数为F_i和D_i,接下来的F_i个整数表示奶牛i喜欢的食品编号,再接下来的D_i个整数表示奶牛i喜欢的饮料编号。

Output

仅一行一个整数,表示FJ最多能让多少头奶牛吃到自己喜欢的食品和饮料。

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

Hint

输入数据表明:奶牛1喜欢的食物1、2;喜欢喝饮料3、1;奶牛2喜欢的食物2、3;喜欢喝饮料1、2;奶牛3喜欢的食物1、3;喜欢喝饮料1、2;奶牛4喜欢的食物1、3;喜欢喝饮料3;

那么下面的分配方法将是最优的:奶牛1不给食品和饮料;奶牛2分配食物2和饮料2;奶牛3分配食物1和饮料2;奶牛4分配食物3和饮料4。

1<=F<=100,1<=D<=100,1<=N<=100

Source

网络流 usaco open 2007 gold dining

建图,左边是食物,中间是牛,右边是饮料,这样只拆n个点(代表牛的点),图中每一条边的容量都为1。

为什么食物和牛不用拆点呢?

我想拆点只在以下这种情况下才需要(出度和入度都大于1)

#include<cstdio>
using namespace std;
#define inf 2100000000
#define maxe 50000
#define maxv 500
int et;
int n, f, d;
int opp[maxe], len[maxe], end[maxe], last[maxv], next[maxe];
int dis[maxv], vd[maxv];
int Min(int a, int b)
{
	return a<b?a:b;
}
int vt;
int dfs(int u, int flow)
{
	int temp, delta, i, e;
	if(u==vt)	return flow;
	delta=0;
	for(i=last[u]; i; i=next[i])
	{
		e=end[i];
		if(len[i]>0&&dis[u]==dis[e]+1)
		{
			temp=dfs(e, Min(flow-delta, len[i]));
			len[i]-=temp;
			len[opp[i]]+=temp;
			delta+=temp;
			if(delta==flow||dis[1]>=vt)return delta;
		}
	}
	if(dis[1]>=vt)return delta;
	vd[dis[u]]--;
	if(vd[dis[u]]==0)dis[1]=vt;
	dis[u]++;
	vd[dis[u]]++;
	return delta;
}
void adde(int s, int e, int c)
{
	et++;
	len[et]=c;
	end[et]=e;
	next[et]=last[s];
	last[s]=et;
}
void addde(int s, int e, int c)
{
	adde(s, e, c);
	opp[et]=et+1;
	adde(e, s, 0);
	opp[et]=et-1;
}
int main()
{
	int ans=0;
	int i, j, k, fi, di, t;
	scanf("%d%d%d", &n, &f, &d);
	vt=2+f+n*2+d;
	for(i=1; i<=f; i++)
	{
		addde(1, 1+i, 1);
	}
	for(i=1; i<=n; i++)
	{
		scanf("%d%d", &fi, &di);
		for(j=1; j<=fi; j++)
		{
			scanf("%d", &t);
			addde(1+t, 1+f+i, 1);
		}
		for(j=1; j<=di; j++)
		{
			scanf("%d", &t);
			addde(1+f+n+i, 1+f+n*2+t, 1);
		}
	}
	for(i=1; i<=n; i++)	addde(1+f+i, 1+f+n+i, 1);
	for(i=1; i<=d; i++)	addde(1+f+n+n+i, vt, 1);
	while(dis[1]<vt)	ans+=dfs(1, inf);
	printf("%d", ans);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 00:37:42

奶牛食品的相关文章

USACO 奶牛食品(网络流)

题目大意: FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃.某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求.但是FJ又不愿意为此重新来做,所以他他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. FJ提供了F (编号为1.2.-.F)种食品并准备了D (编号为1.2.-.D)种饮料, 他的N头牛(编号为1.2.-.N)都已决定了是否愿意吃某种食物和喝某种饮料.FJ想给每一头牛一种食品和一种饮料,使得尽可

谁会是“一带一路”开路先锋?或许这次是奶牛驼队

先看段新闻: 14日至15日,举世瞩目的"一带一路"国际合作高峰论坛在北京举行,论坛主题为"加强国际合作,共建'一带一路',实现共赢发展".国家主席习近平出席开幕式并主持领导人圆桌峰会,29位外国元首.政府首脑及联合国秘书长等3位重要国际组织负责人出席圆桌峰会. 再温习下发端: 2013年,习近平总书记在哈萨克斯坦纳扎尔巴耶夫大学和印度尼西亚国会发表演讲时,分别提出共同建设"丝绸之路经济带"和"21世纪海上丝绸之路"合作倡议.

饥饿的奶牛(洛谷 1868)

题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有重复的部分. 对于奶牛来说,自然是吃的越多越好,然而奶牛智商有限,现在请你帮助他. 输入输出格式 输入格式: 第一行,N,如题 接下来N行,每行一个数x,y,如题 输出格式: 一个数,最多的区间数 输入输出样例 输入样例#1: 3 1 3 7 8 3 4 输出样例#1: 5 说明 1<=n<=15

AC日记——[USACO5.4]奶牛的电信Telecowmunication 洛谷 P1345

[USACO5.4]奶牛的电信Telecowmunication 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 205 #define maxm 20005 #define INF 0x3f3f3f3f int head[maxn],cnt=1,n,m,E[m

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式

2017共识大会快讯:普华永道联合阿里巴巴测试食品供应区块链

普华永道(PwC)澳大利亚正在与阿里巴巴(Alibaba)合作,共同测试新的供应链项目. 消息来自本次2017共识会议.这个专业的服务公司和中国的电子商务巨头此次合作的对象有:新西兰的乳制品独资企业Fonterra.维他命和保健品供应商Blackmores.澳大利亚邮政和新西兰邮政:6家公司共同合作以减少食品供应链中的欺诈现象. 普华永道曾于去年十一月发布了一个Vulcan项目.Vulcan是一个支持连接身份.资金和资产,允许用户便宜快捷地消费.共享.交易或跟踪任何实体或数字资产的平台.http

那么大奶牛之神

题目描述 那么大奶牛之神把一个神秘数字通过信使传递给了奶牛们,但由于信件上出现了偏差,一个数字变成了两个数字,现在你需要通过这两个数字还原出大么大奶牛之神给的神秘数字.需要用第二个数字通过加(+),减(-),乘(*),除(/),次幂(^),阶乘(!),开平方(√)这几个符号凑出第一个数字.使用第二个数字的次数最少的时候,那么使用次数就是神秘数字. 例如第一个数字是300,第二个数字是7,那么7用得最少是6次,所以神秘数字是6.具体方法如图用了6个7.虽然最优解的算式不是唯一的,但是并不妨碍得到最

[USACO08NOV]奶牛混合起来Mixed Up Cows

题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i <= 25,000). The cows are so proud of it that each one now wears her number in a gangsta manner engraved in large letters on a gold plate hung around her

codevs 3060 抓住那头奶牛 x

3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它,他开始在数轴的N 点(0≤N≤100000),奶牛在同一个数轴的K 点(0≤K≤100000). 约翰有两种移动方式:1 分钟内从x 点移动到x+1 或x-1:1 分钟内从x 点移动到2x.假设奶牛不会移动,约翰抓住它需要多少时间? 输入描述 Input Description 一行两个整数N 和K