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 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 }

 

posted on 2016-09-12 16:38  gryzy  阅读(126)  评论(0编辑  收藏  举报

导航