您的位置:首页 > 其它

poj 1149 PIGS (最大流)

2012-06-07 22:21 435 查看
PIGS

Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 11736Accepted: 5184
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

最大流的题
建图是关键
刚开始一直想把笼子算在图里面,各种不行
最后还是
参考大神的解题报告
http://hi.baidu.com/_%B3%D4%B8%D6%C7%D9/blog/item/9e43e235d2b3a035d5074254.html


#include<iostream>
#include<queue>
using namespace std;

const int INF = INT_MAX;

int m, n;
int pigs[1010];
int opend[1010];
int map[110][110];
int pre[1010];
int flow[1010];
int mmax;

int dfs()
{
memset(pre, -1, sizeof(pre));
memset(flow, 0, sizeof(flow));
queue<int> q;
pre[0]=0;
flow[0]=INF;
q.push(0);
while(!q.empty())
{
int k=q.front();
q.pop();
if(k==n+1)
break;
for(int i=1;i<=n+1;i++)
{
if(pre[i]==-1 && map[k][i]!=0)
{
if(map[k][i]<flow[k])
flow[i]=map[k][i];
else
flow[i]=flow[k];
pre[i]=k;
q.push(i);
}
}
}
if(pre[n+1]==-1)
return -1;
return flow[n+1];
}

int ek()
{
mmax=0;
int now, last;
int res;
while((res=dfs()) && res!=-1)
{
mmax+=res;
now = n+1;
while(now!=0)
{
last = pre[now];
map[now][last]+=res;
map[last][now]-=res;
now = last;
}
}
return mmax;
}

int main()
{
freopen("e:\\data.txt", "r", stdin);
freopen("e:\\out.txt", "w", stdout);
while(cin>>m>>n)
{
memset(pigs, 0, sizeof(pigs));
memset(opend, 0, sizeof(opend));
for(int i=1;i<=m;i++)
{
cin>>pigs[i];
}
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
while(k--)
{
int a;
cin>>a;
if(opend[a]==0)
{
map[0][i]+=pigs[a];
opend[a]=i;
}
else
{
map[opend[a]][i]=INF;
opend[a]=i;
}
}
int b;
cin>>b;
map[i][n+1]=b;
}
cout<<ek()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: