1149 PIGS

PIGS
Time Limit: 1000MS
 
Memory Limit: 10000K
Total Submissions: 2084
 
Accepted: 867
DescriptionMirko 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 arives, 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.
InputThe 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.
OutputThe first and only line of the output should contain the number of sold pigs.
Sample Input
 
Sample Output
 
SourceCroatia OI 2002 Final Exam - First day
**********************************************************************************************
**********************************************************************************************
  • Source Code
    #include<stdio.h>
    #include<memory.h>
    #include<math.h>
    #include<stdlib.h>
     
    const int SIZE = 1010;
    const int max = 10000000;
    struct Point{
            int c,f;
    }net[SIZE][SIZE];
    int pre[SIZE],s,t,n;
    int queue[SIZE],head,tail;
     
    bool bfs()
    {
            int i;
            head = tail = 0;
            memset(pre,0,sizeof(pre));
            queue[tail++] = s;
            pre[s] = s;
            while(tail != head){
                   int temp = queue[head++];
                   for(i = 1; i <= n+2; i++)
                           if(pre[i] == 0 && (net[temp][i].c>net[temp][i].f && 
    net[temp][i].f>=0 || net[i][temp].c>=net[i][temp].f && net[i][temp].f>0)){
                                   if(net[temp][i].f < net[temp][i].c)
                                          pre[i] = temp;
                                   if(net[i][temp].f > 0)
                                          pre[i] = -temp;
                                   if(i == t){
                                          return true;
                                   }
                                   else
                                           queue[tail++] = i;
                           }
            }
            return false;
    }
    int maxflow()
    {
            int flow = 0,i;
            while(bfs()){
                   int dx = 0x7FFFFFFF;
                   int temp;
                   for(i = t; i != s; i = abs(pre[i])){
                           if(pre[i] >= 0)
                                   temp = net[pre[i]][i].c-net[pre[i]][i].f;
                           else
                                   temp = net[i][-pre[i]].f;
                           if(dx > temp)
                                   dx = temp;
                   }
                   for(i = t; i != s; i= abs(pre[i])){
                           if(pre[i] >= 0)
                                   net[pre[i]][i].f += dx;
                else
                                   net[i][-pre[i]].f -= dx;
                   }
                   flow += dx;
            }
            return flow;
    }
     
    int num[1010],f[1010];
    int main()
    {
            int m,i,j,temp;
            scanf("%d %d",&m,&n);
            for(i = 1; i <= m; i++){
                   scanf("%d",&num[i]);
                   f[i] = 0;
            }
            int x;
            for(j = 2; j <= n+1; j++){
                   scanf("%d",&temp);
                   for(int k = 0; k < temp; k++){
                           scanf("%d",&x);
                           if(f[x] == 0){
                                   net[1][j].c += num[x];
                                   f[x] = j;
                           }
                           else
                                   net[f[x]][j].c = max;
                   }
                   scanf("%d",&temp);
                   net[j][n+2].c = temp;
            }
            s = 1; t = n+2;
            int out = maxflow();
            printf("%d/n",out);
            return 0;
    }
    

  •  
    7
    3 3
    3 1 10
    2 1 2 2
    2 1 3 3
    1 2 6

    좋은 웹페이지 즐겨찾기