首页 > 代码库 > PIGS_POJ1149

PIGS_POJ1149

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 33 1 102 1 2 22 1 3 31 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 }

 

PIGS_POJ1149