POJ1149 网络流最大流
2012-08-21 10:54
447 查看
[b]PIGS[/b]
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
View Code
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 12372 | Accepted: 5476 |
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 题意:M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每个猪圈有已知数量的猪, 但是猪圈可以重新打开,将猪的个数,重新分配,以达到卖出的猪的数量最多。 思路:刚学网络流,表示很菜很菜很菜~~ ①构造网络,将顾客看成源点和汇点以外的结点,并设另外两个节点:源点和汇点。 ②源点和每个猪圈的第一个顾客连边,边的权是开始时候猪圈中猪的数量。 ③ 若源点和某个节点之间有重边,则将权合并 ④顾客j紧跟顾客i之后打开某个猪圈,则<i.j>的权是正无穷。 ⑤每个顾客和会点之间连边,边的权值是顾客所希望购买的猪的数量。 例如:样例中的就可以建立如图:
View Code
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define M 210 struct Matix{ int c,f; }edge[M][M]; int n,m; int s,t; int resi[M][M]; int qu[M*M],qs,qe; int pre[M]; int vis[M]; int maxflow,min_augment; void find_augment_path(){ int i,v; memset(vis,0,sizeof(vis)); qs=0;qu[qs]=s; pre[s]=s;vis[s]=1;qe=1; memset(resi,0,sizeof(resi)); memset(pre,0,sizeof(pre)); while(qs<qe&&pre[t]==0){ v=qu[qs++]; for(i=1;i<=n;i++){ if(vis[i]==0){ if(edge[v][i].c-edge[v][i].f>0){ resi[v][i]=edge[v][i].c-edge[v][i].f; pre[i]=v;qu[qe++]=i;vis[i]=1; }else if(edge[i][v].f>0){ resi[v][i]=edge[i][v].f; pre[i]=v;qu[qe++]=i;vis[i]=1; } } } } } void augment_flow(){ int i=t,j; if(pre[i]==0) {min_augment=0;return;} j=0x7fffffff; while(i!=s){ if(resi[pre[i]][i]<j) j=resi[pre[i]][i]; i=pre[i]; } min_augment=j; } void update_flow(){ int i=t; if(pre[i]==0) return ; while(i!=s){ if(edge[pre[i]][i].c-edge[pre[i]][i].f>0) edge[pre[i]][i].f+=min_augment; else if(edge[i][pre[i]].f>0) edge[pre[i]][i].f+=min_augment; i=pre[i]; } } void solve(){ s=1;t=n; maxflow=0; while(1){ find_augment_path(); augment_flow(); maxflow+=min_augment; if(min_augment>0) update_flow(); else return ; } } int main(){ int i; int u,v,w; while(scanf("%d%d",&m,&n)!=EOF){ memset(edge,0,sizeof(edge)); for(i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&w); edge[u][v].c+=w; } solve(); printf("%d\n",maxflow); } return 0; }
相关文章推荐
- poj 1149 PIGS 【网络流经典建模】【求最大流】
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
- poj 1149 PIGS (网络流最大流Dinic)
- poj 1149 PIGS(网络流+最大费用流+ford)
- POJ 1149 网络流最大流 解题报告
- 网络流(最大流):POJ 1149 PIGS
- poj 1149 PIGS(网络流+最大费用流+ford)
- [网络流-最大流]POJ1149-PIGS (特殊建图)
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
- POJ 1149 PIGS(网络流—最大流)
- POJ 1149 PIGS 【网络流建模汇总】最大流
- POJ1149最大网络流
- POJ 1274 The Perfect Stall (网络流-最大流)
- poj 1149 最大流构图
- poj 3281 Dining(网络流最大流+分点)
- POJ 1149 PIGS 最大流
- POJ 1459 Power Network(网络流 最大流 多起点,多汇点)
- POJ 1149 PIGS 网络流Dinic
- POJ 1149 最大流<建图> PIGS
- 网络流 最大流 poj 1273