poj 1149 PIGS (最大流)
2012-06-07 22:21
435 查看
PIGS
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
Sample Output
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11736 | Accepted: 5184 |
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; }
相关文章推荐
- poj 1149 PIGS【最大流】
- poj 1149 PIGS(网络流+最大费用流+ford)
- POJ 1149-PIGS(Ford-Fulkerson 标号法求网络最大流)
- Poj 1149 PIGS【最大流Dinic+建图】
- POJ 1149 最大流 PIGS
- poj 1149 PIGS(网络流+最大费用流+ford)
- POJ 1149 PIGS(最大流)
- POJ-1149-PIGS(最大流 标号法)
- POJ 1149 最大流<建图> PIGS
- 【POJ 1149】 Pigs 最大流
- POJ 1149 PIGS(网络流—最大流)
- POJ 1149 PIGS (最大流)
- poj1149 PIGS(建图最大流)
- POJ1149 PIGS 网络最大流
- POJ 1149 PIGS (最大流)
- POJ 1149 PIGS 最大流建图
- POJ 1149 PIGS 最大流 构图!
- poj 1149 PIGS(最大流)
- POJ 1149 PIGS(最大流+建图)
- POJ1149 PIGS [最大流 建图]