POJ 1149 网络流最大流 解题报告
2017-06-09 11:55
471 查看
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
3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6
Sample Output
7
【解题报告】(转载自网络流建模汇by Edelweiss )
代码如下:
让我看到你们的双手
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
【解题报告】(转载自网络流建模汇by Edelweiss )
代码如下:
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> using namespace std; #define inf 0x3f3f3f3f #define maxv 10005 #define maxe 100005 int nume=0,head[maxv],e[maxe][3]; void inline adde(int i,int j,int c) { e[nume][0]=j;e[nume][1]=head[i];head[i]=nume; e[nume++][2]=c; e[nume][0]=i;e[nume][1]=head[j];head[j]=nume; e[nume++][2]=0; } int ss,tt,n,m; int vis[maxv],lev[maxv]; bool bfs() { for(int i=0;i<maxv;i++) vis[i]=lev[i]=0; queue<int>q; q.push(ss); vis[ss]=1; while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=head[cur];i!=-1;i=e[i][1]) { int v=e[i][0]; if(!vis[v]&&e[i][2]>0) { lev[v]=lev[cur]+1; vis[v]=1; q.push(v); } } } return vis[tt]; } int dfs(int u,int minf) { if(u==tt||minf==0)return minf; int sumf=0,f; for(int i=head[u];i!=-1&&minf;i=e[i][1]) { int v=e[i][0]; if(lev[v]==lev[u]+1&&e[i][2]>0) { f=dfs(v,minf<e[i][2]?minf:e[i][2]); e[i][2]-=f;e[i^1][2]+=f; sumf+=f;minf-=f; } } if(!sumf) lev[u]=-1; return sumf; } int Dinic() { int sum=0; while(bfs())sum+=dfs(ss,inf); return sum; } vector<int>a[200]; int pig[1005]; int L[1005]; int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&m,&n); ss=0,tt=n+1; for(int i=1;i<=m;++i) scanf("%d",&pig[i]); for(int i=1;i<=n;++i) { int x,y; scanf("%d",&x); while(x--) { scanf("%d",&y); a[i].push_back(y); } scanf("%d",&y); adde(i,tt,y); } for(int i=1;i<=n;i++) for(int j=0;j<a[i].size();j++) { int v=a[i][j]; if(!L[v]) { L[v]=i; adde(ss,i,pig[v]); } else { adde(L[v],i,inf); L[v]=i; } } printf("%d\n",Dinic()); return 0; }
让我看到你们的双手
相关文章推荐
- POJ - 1459 Power Network解题报告(网络流最大流 超级源点建图)
- POJ - 1149 PIGS解题报告(网络流+巧妙建图)
- POJ 3281 网络流最大流 解题报告
- 【原】 POJ 1163 The Triangle 三角形最大路径 动态规划 解题报告
- POJ2112解题报告【网络流-初级-isap+floyd_warshall+二分】
- poj 1149 PIGS (网络流最大流Dinic)
- 【POJ 2396】 Budget 带上下界网络流 解题报告
- POJ1149最大网络流
- 解题报告 之 POJ1149 Pigs
- poj 1149 PIGS 【网络流经典建模】【求最大流】
- POJ 1149 解题报告
- POJ - 3281 Dining解题报告(网络流 巧妙建图)
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
- poj 1149 PIGS(网络流+最大费用流+ford)
- 网络流(最大流):POJ 1149 PIGS
- POJ 1149 PIGS(网络流—最大流)
- POJ-1730 Perfect Pth Powers 解题报告(数论) 最大开方数
- POJ 3422 Kaka's Matrix Travels 解题报告(最大费用最大流)
- POJ - 3176 Cow Bowling解题报告(求三角形数最大路)
- POJ 1149 PIGS 【网络流建模汇总】最大流