• 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 }
  • 相关阅读:
    后台取得非服务器控件的一种方法(Request.Form.GetKey(i))
    扩展jQuery键盘事件的几个基本方法(练习jQuery插件扩展)
    Javascript得到CheckBoxList的Value
    sql server的count(小技巧)
    oracle数据库约束条件删除、取消、启用
    iis7.0修改网站端口
    session模式和web园
    理解Session State模式+ASP.NET SESSION丢失FAQ (转)
    Gridview中生成的属性rules="all",在Firefox出现内线框解决办法
    一个类windows系统的效果图
  • 原文地址:https://www.cnblogs.com/gryzy/p/5865294.html
Copyright © 2020-2023  润新知