【POJ3281】Dining 网络流

题意:n牛m食品p饮品

第牛有ai种可行食品,bi种可行饮品

现在进行搭配,一头牛如果既有一份可行食品又有一份可行饮品就称为被满足。

求最多满足。

题解:

别忘了牛拆点、

代码:

#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 405 // 网络图中点
#define G 50000 // 网络图中边
#define inf 0x3f3f3f3f
using namespace std;
struct KSD
{
	int v,next,len;
}e[G];
int head[N],cnt;
void add(int u,int v,int len)
{
	cnt++;
	e[cnt].v=v;
	e[cnt].len=len;
	e[cnt].next=head[u];
	head[u]=cnt;
}
queue<int>q;
int d[N],s,t;
bool bfs()
{
	memset(d,0,sizeof(d));
	int i,u,v;
	while(!q.empty())q.pop();
	q.push(s),d[s]=1;
	while(!q.empty())
	{
		u=q.front(),q.pop();
		for(i=head[u];i;i=e[i].next)if(e[i].len)
		{
			v=e[i].v;
			if(!d[v])
			{
				d[v]=d[u]+1;
				if(v==t)
					return 1;
				q.push(v);
			}
		}
	}
	return 0;
}
int dinic(int x,int flow)
{
	if(x==t)return flow;
	int remain=flow,k;
	int i,v;
	for(i=head[x];i&&remain;i=e[i].next)
	{
		v=e[i].v;
		if(e[i].len&&d[v]==d[x]+1)
		{
			k=dinic(v,min(remain,e[i].len));
			if(!k)d[v]=0;
			e[i^1].len+=k,e[i].len-=k;
			remain-=k;
		}
	}
	return flow-remain;
}
int n,m,p,maxflow;
bool work()
{
	if(scanf("%d%d%d",&n,&m,&p)==EOF)return 0;
	int i,a,b,c;
	s=n+n+m+p+1,t=n+n+m+p+2,cnt=1;
	memset(head,0,sizeof(head));
	maxflow=0;

	for(i=1;i<=n;i++)add(i,i+n,1),add(i+n,i,0);
	for(i=1;i<=m;i++)add(s,i+n+n,1),add(i+n+n,s,0);
	for(i=1;i<=p;i++)add(i+n+n+m,t,1),add(t,i+n+n+m,0);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		while(a--)
		{
			scanf("%d",&c);
			add(c+n+n,i,1),add(i,c+n+n,0);
		}
		while(b--)
		{
			scanf("%d",&c);
			add(i+n,c+n+n+m,1),add(c+n+n+m,i+n,0);
		}
	}
	while(bfs())maxflow+=dinic(s,inf);
	printf("%d\n",maxflow);
	return 1;
}
int main()
{
//	freopen("test.in","r",stdin);
	while(work());
}
时间: 2024-10-08 06:49:08

【POJ3281】Dining 网络流的相关文章

POJ-3281 Dining 网络流最大流

Dining 题意: 现在有一个养牛场厂主,他有F种食物,D种水,每种都只有一份. 现在他有n头牛,每种牛需要吃一份食物,一种水,对于每头牛来说 食物都有Fi种选项,水有Di种选项,各自都需要选一种. 现在Q最多有多少头牛可以满足摄入的需求. 建图: 不加思考想到的是关系图,食物和水都指向牛,但是转念一想我们没办法保证一头牛能够满足条件,因为需要食物和水同时流入, 这就不合法了. 我们可以食物流向牛,牛流向牛的拆点,牛的拆点再流向水,水再流向t. 这样就可以找到一条链, 食物 -> 牛 ->

解题报告 之 POJ3281 Dining

解题报告 之 POJ3281 Dining Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulous meals for his cows, but he forgot to check his menu against their

poj3281 Dining

---恢复内容开始--- Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9587   Accepted: 4426 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has c

hdu-4292.food(类dining网络流建图)

Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9289    Accepted Submission(s): 3019 Problem Description You, a part-time dining service worker in your college’s dining hall, are now confus

POJ 3281 Dining (网络流之最大流)

题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料.每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给一头牛.最多能有多少头牛可以同时得到喜欢的食物和饮料? 析:是一个经典网络流的题,建立一个超级源点,连向每种食物,建立一个超级汇点,连向每种饮料,然后把每头牛拆成两个点, 一个和食物连,一个和饮料连,最后跑一遍最大流即可. 代码如下: #pragma comment(linker, "/STACK:

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10159   Accepted: 4676 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

POJ3281:Dining(dinic+拆点)

题目链接:http://poj.org/problem?id=3281 PS:刷够网络流了,先这样吧,之后再刷,慢慢补. 题意:有F种食物,D种饮料,N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份),一种食物被一头牛吃了之后,其余牛就不能吃了 第一行有N,F,D三个整数:接着2-N+1行代表第i头牛,前面两个整数是Fi与Di(食物与饮料的种类数量),接着是食物的种类与饮料的种类 要求输出最多分配能够满足的牛的数量. 思路:这是一种神奇的建图方式-拆点.让我想打死都想不出来.sad 建图,有

POJ-3281 Dining 最大流 拆点

题目链接:https://cn.vjudge.net/problem/POJ-3281 题意 题意找kuangbin的用了. 有N头牛,F个食物,D个饮料. N头牛每头牛有一定的喜好,只喜欢几个食物和饮料. 每个食物和饮料只能给一头牛.一头牛只能得到一个食物和饮料. 而且一头牛必须同时获得一个食物和一个饮料才能满足.问至多有多少头牛可以获得满足. 思路 建图如下就完事了: 提交过程 AC 代码 #include <queue> #include <cstdio> #include

[POJ3281]Dining 最大流(建图奇葩)

题目链接:http://poj.org/problem?id=3281 参考了某犇做的PPT.对于此题的解释有如下内容(我只是搬运工). [题目大意] 有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮料.(1 <= F <= 100, 1 <= D <= 100, 1 <= N <= 100) 此题的建模方法比较有开创性.以往