USACO 奶牛食品(网络流)

题目大意:

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

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

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

(原谅我找不到原题,只有把学校OJ的题粘过来)

思路:网络流的模板题,f作为左边一部,n作为中间一部,d作为右边一部,起点向f部连边,d部向终点连边。

#include<cstdio>
#define MAXN 310
#define Min(a,b) a<b?a:b
#define INF 999999999
#define BIG 123456789
using namespace std;
int c[MAXN][MAXN];
int dd[MAXN];
int vd[MAXN];
int s,t,n,f,d,flow;
int aug(int u,int augco)
{
	int j,augc = augco,mind = t,delta;
	if(u == t) return augco;
	for(j = 0; j <= t; j++)
	if(c[u][j])
	{
		if(dd[u] == dd[j]+1)
		{
			delta = Min(c[u][j],augc);
			delta = aug(j,delta);
			c[u][j] -= delta;
			c[j][u] += delta;
			augc -= delta;
			if(dd[s] > t) return augco - augc;
			if(augc == 0) break;
		}
		mind = Min(mind,dd[j]);
	}
	if(augco == augc)
	{
		vd[dd[u]]--;
		if(vd[dd[u]] == 0) dd[s] = t+1;
		dd[u] = mind+1;
		vd[dd[u]]++;
	}
	return augco - augc;
}
void sap()
{
	vd[0] = t+1;
	while(dd[s] < t+1)
		flow += aug(s,BIG);
}
int main()
{
	int p1,p2,v;
	scanf("%d%d%d",&n,&f,&d);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d%d",&p1,&p2);
		for(int j = 1; j <= p1; j++)
		{
			scanf("%d",&v);
			c[v][f+i] = 1;
		}
		for(int j = 1; j <= p2; j++)
		{
			scanf("%d",&v);
			c[n+i][n+f+v] = 1;
		}
	}
	s = 0;
	t = n+f+d+1;
	for(int i = 1; i <= f; i++)
		c[s][i] = 1;
	for(int i = 1; i <= d; i++)
		c[n+f+i][t] = 1;
	sap();
	printf("%d\n",flow);
}

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

时间: 2024-08-11 16:19:43

USACO 奶牛食品(网络流)的相关文章

[USACO]奶牛会展(背包)

[USACO]奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零.满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值. 输入输出格式 输入格式: ? 第一行:单个整数N,1 ≤ N ≤ 400 ? 第二行到第N + 1 行:第i + 1 行有

奶牛食品

Time Limit:10000MS  Memory Limit:65536K Total Submit:132 Accepted:61 Case Time Limit:1000MS Description FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃.某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求.但是FJ又不愿意为此重新来做,所以他他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. FJ提供了F

USACO草地排水-网络流dinic模板

广搜计算层次图,在层次图上深搜.标准dinic模板. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<vector> 5 #include<queue> 6 #include<cmath> 7 #include<algorithm> 8 #include<string.h> 9 #define INF 0x7fffff

BZOJ 1666 Usaco 奶牛的数字游戏

1 #include <cstdio> 2 #include <algorithm> 3   4 int n; 5 int tot; 6   7 int main(){ 8     scanf("%d",&n); 9     while(n!=1){ 10         if(n%2!=0){ 11             n=n*3+1; 12             tot++; 13         } 14         else if(n%

USACO 奶牛排队

题目:给出一个只含有1,2,3的数字序列,问最少交换多少次才能将之变为递增数列. 解: 注意到只有1,2,3,我们只要将1,3交换到自己的应在位置上那么排序就已经完成了. 需要交换的有几种,记$a(x,,y)$表示x在应该是y的位置上的$a(i)$的个数,那么我们优先交换a(1,3)和a(3,1)里的数字,一次交换扳正两个位置,接下来要想扳正一个1或3的位置就必须要进行一次交换操作. 统计计算即可. 1 #include <iostream> 2 #include <cstdio>

奶牛通讯 usaco 网络流

这道题很有意思,原题是只需输出最小割集大小,现在oj上改成了输出字典序最小的割集: 题解:可以考虑从小到大删边,若删掉这条边后,最小割变小,保持不变,记录此时的最小割大小: 若最小割不变,恢复这条边: 这样做的原因是什么呢?从小到大可以保证字典序的要求,删完边后若最小割减小,这条边一定在最小割上,删掉它不再恢复可以保证不在把这条通路上的其他边也收进来: 网络流博大精深,还是需要好好体会的: 但在此之前,应该先会敲代码: 1 #include<iostream> 2 #include<cs

1861 奶牛的数字游戏 2006年USACO

codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N是奇数,那么奶牛就会把它乘以3后再加1.如果N是偶数,那么这个数就会被除以2.数字每变动一次,这头奶牛就得到1分.当N的

SPFA cojs 176. [USACO Feb07] 奶牛聚会

cojs 176. [USACO Feb07] 奶牛聚会 ★☆   输入文件:sparty.in   输出文件:sparty.out   简单对比时间限制:3 s   内存限制:16 MB N(1 ≤ N ≤ 1000)个农场中的每个农场都有一只奶牛去参加位于第X个农场的聚会.共有M (1 ≤ M ≤ 100,000)条单向的道路,每条道路连接一对农场.通过道路i会花费Ti (1 ≤ Ti ≤ 100)的时间. 作为参加聚会的奶牛必须走到聚会的所在地(农场X).当聚会结束时,还要返回各自的农场.

157. [USACO Nov07] 奶牛跨栏

157. [USACO Nov07] 奶牛跨栏(点击转到COGS) 输入文件:hurdles.in   输出文件:hurdles.out 时间限制:1 s   内存限制:128 MB 译 by CmYkRgB123 描述 Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高栏却很难.于是,奶牛们总是关心路径上最高的栏的高度. 奶牛的训练场中有 N (1 ≤ N ≤ 300)