poj 1149 PIGS 【网络最大流】
2014-10-28 14:20
417 查看
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: 16630 | Accepted: 7457 |
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 33 1 102 1 2 22 1 3 31 2 6
Sample Output
7
分析:此题关键和难点是建图,建立源点和汇点,把顾客当作源点和汇点之外的节点。使每个打开猪笼第一个
顾客与源点链接,权值为此猪笼的猪的数量,其他顾客与其要打开的猪笼的上以为顾客链接权值为INF。
最后把每位顾客与汇点相连,权值为次顾客索要猪的数量。这样图就建好了,跑一便最大流即可。
代码示例:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #define Lh 2000 #define Le 200000 #define max 1000000000 using namespace std; typedef struct { int to; int w; int next; }node; typedef struct { int x; int t; }DEP; node E[Le]; DEP fir,nex; int head[Lh],headx[Lh],deep[Lh],cnt; void ADD(int a,int b,int c) { E[++cnt].to=b; E[cnt].w=c; E[cnt].next=head[a]; head[a]=cnt; E[++cnt].to=a; E[cnt].w=0; E[cnt].next=head[b]; head[b]=cnt; } int min(int x,int y) { return x<y?x:y; } int bfs(int s,int t,int n) { memset(deep,255,sizeof(deep)); queue<DEP>Q; fir.x=s; fir.t=0; deep[s]=0; Q.push(fir); while(!Q.empty()) { fir=Q.front(); Q.pop(); for(int i=head[fir.x];i;i=E[i].next) { nex.x=E[i].to; nex.t=fir.t+1; if(deep[nex.x]!=-1||!E[i].w) continue; deep[nex.x]=nex.t; Q.push(nex); } } for(int i=0;i<=n;i++) headx[i]=head[i]; return deep[t]!=-1; } int dfs(int s,int t,int flow) { if(s==t) return flow; int newflow=0; for(int i=headx[s];i;i=E[i].next) { headx[s]=i; int to=E[i].to; int w=E[i].w; if(!w||deep[to]!=deep[s]+1) continue; int temp=dfs(to,t,min(w,flow-newflow)); newflow+=temp; E[i].w-=temp; E[i^1].w+=temp; if(newflow==flow) break; } if(!newflow)deep[s]=0; return newflow; } int Dinic(int s,int t,int m) { int sum=0; while(bfs(s,t,m)) { sum+=dfs(s,t,max); } return sum; } int main() { int m,n; int pig[1010],pre[1010]; int a,k,b; int s,t,num; while(~scanf("%d%d",&m,&n)) { memset(head,0,sizeof(head)); cnt=1; memset(pre,0,sizeof(pre)); for(int i=1;i<=m;i++) scanf("%d",&pig[i]); s=n+1; t=n+2; num=0; for(int i=1;i<=n;i++) { scanf("%d",&a); for(int j=1;j<=a;j++) { scanf("%d",&k); if(!pre[k]) { ADD(s,i,pig[k]); num++; } else { ADD(pre[k],i,max); num++; } pre[k]=i; } scanf("%d",&b); ADD(i,t,b); num++; } printf("%d\n",Dinic(s,t,num)); } return 0; }
相关文章推荐
- POJ1149 PIGS 网络最大流
- POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)
- poj 1149 PIGS 最大网络流
- POJ 1149-PIGS(Ford-Fulkerson 标号法求网络最大流)
- POJ 1149 PIGS(最大流)
- 【最大流】【POJ1149】PIGS
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
- poj 1149 PIGS(最大流+经典构图)
- POJ 1149 PIGS 最大流 构图!
- poj1149 PIGS 最大流 神奇的建图
- POJ 1149 PIGS 最大流
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
- poj 1149 PIGS(最大流)
- poj 1149 PIGS (最大流)
- POJ 1149 PIGS (最大流Dinic)
- POJ 1149 PIGS (最大流Dinic)
- poj 1149 PIGS 最大流
- poj 1149 PIGS(网络流+最大费用流+ford)
- POJ 1149 PIGS 最大流
- poj 1149 pigs ---- 最大流