PIGS
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20253 | Accepted: 9252 |
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 DINIC练习,题目的建图值的注意!
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 #include<vector> 6 7 using namespace std; 8 const int inf=0x7fffffff; 9 int n,m; 10 int map[110][110]; 11 int house[1010]; 12 int fir[1010]={0}; 13 int lays[110]; 14 bool vis[110]={0}; 15 bool bfs() 16 { 17 memset(lays,-1,sizeof(lays)); 18 queue<int>q; 19 lays[0]=0; 20 q.push(0); 21 while(!q.empty()) 22 { 23 int u=q.front();q.pop(); 24 for(int i=1;i<=n+1;i++) 25 if(map[u][i]>0&&lays[i]==-1) 26 { 27 lays[i]=lays[u]+1; 28 if(i==n+1)return 1; 29 else q.push(i); 30 } 31 } 32 return 0; 33 } 34 int dinic() 35 { 36 int maxf=0; 37 vector<int>q; 38 while(bfs()) 39 { 40 memset(vis,0,sizeof(vis)); 41 q.push_back(0); 42 vis[0]=1; 43 while(!q.empty()) 44 { 45 int nd=q.back(); 46 if(nd==n+1) 47 { 48 int minn,minx=0x7fffffff; 49 for(int i=1;i<q.size();i++) 50 { 51 int u=q[i-1],v=q[i]; 52 if(map[u][v]<minx) 53 { 54 minx=map[u][v]; 55 minn=u; 56 } 57 } 58 maxf+=minx; 59 for(int i=1;i<q.size();i++) 60 { 61 int u=q[i-1],v=q[i]; 62 map[u][v]-=minx; 63 map[v][u]+=minx; 64 } 65 while(!q.empty()&&q.back()!=minn) 66 { 67 vis[q.back()]=0; 68 q.pop_back(); 69 } 70 } 71 else 72 { 73 int i; 74 for(i=0;i<=n+1;i++) 75 { 76 if(map[nd][i]>0&&lays[i]==lays[nd]+1&&!vis[i]) 77 { 78 q.push_back(i); 79 vis[i]=1; 80 break; 81 } 82 } 83 if(i>n+1)q.pop_back(); 84 } 85 } 86 } 87 return maxf; 88 } 89 int main() 90 { 91 cin>>m>>n; 92 for(int i=1;i<=m;i++) 93 scanf("%d",house+i); 94 for(int i=1;i<=n;i++) 95 { 96 int keys; 97 scanf("%d",&keys); 98 for(int j=0;j<keys;j++) 99 { 100 int keyn; 101 scanf("%d",&keyn); 102 if(fir[keyn]==0)map[0][i]+=house[keyn]; 103 else map[fir[keyn]][i]=inf; 104 fir[keyn]=i; 105 } 106 int pigs; 107 scanf("%d",&pigs); 108 map[i][n+1]=pigs; 109 } 110 cout<<dinic()<<endl; 111 return 0; 112 }