您的位置:首页 > 产品设计 > UI/UE

UVA 11045 - My T-shirt suits me

2012-02-26 20:22 375 查看
这是一道网络流的题。将六种不同大小的衣服看成六个点,编号1-6,

将志愿者从7-M +6编号,然后源点s = 0, 汇点t = M + 7,网络

流的模型就出来了。从源点到衣服的容量是N / 6,从志愿者到汇点

的容量是1, 从衣服到志愿者的容量也是1.然后就按照白书上

的EK算法写,用BFS找增广路。

#include<iostream>
#include<cstring>
#include<queue>
#define INF 100000000
#define MAXD 50
using namespace std;
int flow[MAXD][MAXD], cap[MAXD][MAXD], p[MAXD], a[MAXD];
char str[][5] = {"\0", "XXL", "XL", "L", "M", "S", "XS"};
char ch1[5], ch2[5];
int s, t;
int N, M;

int min( int a, int b)
{
return a < b ? a : b;
}

void init()
{
int j, k;
memset( cap, 0, sizeof cap);
cin >> N >> M;
s = 0, t = M + 7;
for( int i = 1; i <= 6; i ++)
cap[s][i] = N / 6;
for( int i = 7; i < t; i ++)
{
cin >> ch1 >> ch2;
for( j = 1; strcmp( ch1, str[j]) != 0; j ++); //找到第一件衣服的编号
for( k = 1; strcmp( ch2, str[k]) != 0; k ++); //分号不能少
cap[j][i] = cap[k][i] = 1;
cap[i][t] = 1;
}
}

bool EK()
{
queue<int> q;
memset( flow, 0, sizeof flow);
//memset( p, 0, sizeof p);
int f = 0;
for( ; ; )
{
memset( a, 0, sizeof a);
a[s] = INF;
q.push(s);
while( !q.empty() )
{
int u = q.front(); q.pop();
for( int v = s; v <= t; v ++)
if( !a[v] && cap[u][v] > flow[u][v])
{
p[v] = u; q.push(v);
a[v] = min( a[u], cap[u][v] - flow[u][v]);
}
}

if( a[t] == 0) break;

for( int u = t; u != s; u = p[u])
{
flow[ p[u]][u] += a[t]; //更新正向流量
flow[u][ p[u]] -= a[t]; //更新反向流量
}
f += a[t];
}
if( f == M) return true;
return false;
}

int main()
{
int cas;
cin >> cas;
while( cas --)
{
init();
bool ok = EK();
if( ok) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: