POJ3281 网络流 dining

本文介绍了一种使用图论解决流量分配问题的方法,详细阐述了算法的设计、实现及应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
using namespace std;


#define mxn 820
#define inf 0x3f3f3f3f
#define ll long long 
#define ull unsigned long long
#define eps 1e-8

int g[mxn][mxn], flow[mxn][mxn], a[mxn], q[mxn*mxn], p[mxn];
int head, tail;

int n, f, d;

int main() {
	scanf( "%d%d%d", &n, &f, &d );
	memset( g, 0, sizeof( g ) );
	int tot = f + 2 * n + d + 1;
	for( int i = 1; i <= n; ++i ) {
		g[f+i][f+n+i] = 1;
	}
	for( int i = 1; i <= f; ++i )
		g[0][i] = 1;
	for( int i = 1; i <= d; ++i ) 
		g[f+2*n+i][tot] = 1;
	for( int i = 1; i <= n; ++i ) {
		int _f, _d;
		scanf( "%d%d", &_f, &_d );
		int ff, dd;
		for( int j = 1; j <= _f; ++j ) {
			scanf( "%d", &ff );
			g[ff][i+f] = 1;
		}
		for( int j = 1; j <= _d; ++j ) {
			scanf( "%d", &dd );
			g[i+f+n][f+2*n+dd] = 1;
		}
	}
	int ans = 0;
	memset( flow, 0, sizeof( flow ) );
	while( 1 ) {
		memset( a, 0, sizeof ( a ) );
		a[0] = inf;
		head = tail = 0;
		q[tail++] = 0;
		while( head < tail ) {
			int u = q[head++];
			for( int v = 0; v <= tot; ++v ) {
				if( !a[v] && g[u][v] > flow[u][v] ) {
					p[v] = u;
					q[tail++] = v;
					a[v] = min( a[u], g[u][v] - flow[u][v] );
				}
			}
		}
		if( a[tot] == 0 )
			break;
		for( int c = tot; c ; c = p[c] ) {
			flow[p[c]][c] += a[tot];
			flow[c][p[c]] -= a[tot];
		}
		ans += a[tot];
	}
	printf( "%d\n", ans );
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值