您的位置:首页 > 理论基础 > 计算机网络

poj 1149 PIGS 最大网络流

2014-08-01 08:50 309 查看
Description

Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come to the farm one after another. Each of them has keys to some pig-houses and wants to buy a certain number of
pigs.

All data concerning customers planning to visit the farm on that particular day are available to Mirko early in the morning so that he can make a sales-plan in order to maximize the number of pigs sold.

More precisely, the procedure is as following: the customer arrives, opens all pig-houses to which he has the key, Mirko sells a certain number of pigs from all the unlocked pig-houses to him, and, if Mirko wants, he can redistribute the remaining pigs across
the unlocked pig-houses.

An unlimited number of pigs can be placed in every pig-house.

Write a program that will find the maximum number of pigs that he can sell on that day.
Input

The first line of input contains two integers M and N, 1 <= M <= 1000, 1 <= N <= 100, number of pighouses and number of customers. Pig houses are numbered from 1 to M and customers are numbered from 1 to N.

The next line contains M integeres, for each pig-house initial number of pigs. The number of pigs in each pig-house is greater or equal to 0 and less or equal to 1000.

The next N lines contains records about the customers in the following form ( record about the i-th customer is written in the (i+2)-th line):

A K1 K2 ... KA B It means that this customer has key to the pig-houses marked with the numbers K1, K2, ..., KA (sorted nondecreasingly ) and that he wants to buy B pigs. Numbers A and B can be equal to 0.
Output

The first and only line of the output should contain the number of sold pigs.
Sample Input
3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6

Sample Output
7

Source
#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

#include<deque>

using namespace std;

#define maxn 550

#define INF 99999999

int Map[maxn][maxn];

int prev[maxn];

bool vis[maxn];

int come[1100],pig[1100];

void EK(int x,int n)

{

int sum=0;

int temp,u,v,i;

while(1)

{

memset(vis,false,sizeof(vis));

memset(prev,0,sizeof(prev));

deque<int>Q;

prev[x]=0;

vis[x]=true;

Q.push_back(x);

while(!Q.empty())

{

// printf("**********\n");

u=Q.front();

Q.pop_front();

for(v=1;v<=n;v++)

{

//printf("+++++++++++\n");

if(!vis[v]&&Map[u][v])

{

prev[v]=u;

vis[v]=true;

if(v==n)

{

Q.clear();

break;

}

else

Q.push_back(v);

}

}

}

if(!vis
)

break;

temp=INF;

i=n;

while(prev[i])

{

if(temp>Map[prev[i]][i])

temp=Map[prev[i]][i];

//printf("+++++++++++\n");

i=prev[i];

}

i=n;

while(prev[i])

{

Map[prev[i]][i]-=temp;

Map[i][prev[i]]+=temp;

// printf("**********\n");

i=prev[i];

}

//printf("%d\n",temp);

sum+=temp;

}

printf("%d\n",sum);

}

int main()

{

int m,n;

int i,j,k;

int t;

int x;

while(scanf("%d%d",&m,&n)!=EOF)

{

k=n+1;

memset(come,0,sizeof(come));

memset(Map,0,sizeof(Map));

for(i=1;i<=m;i++)

scanf("%d",&pig[i]);

for(i=1;i<=n;i++)

{

scanf("%d",&t);

for(j=1;j<=t;j++)

{

scanf("%d",&x);

if(!come[x])

Map[k][i]+=pig[x];

else

Map[come[x]][i]=INF;

come[x]=i;//记录猪圈的指向

}

scanf("%d",&Map[i][k+1]);

}

EK(k,k+1);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: