POJ 1149 网络流最大流 解题报告

来源:互联网 发布:小工具源码 编辑:程序博客网 时间:2024/06/07 12:10

PIGS

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

【解题报告】(转载自网络流建模汇by Edelweiss )
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

代码如下:

#include<cstdio>  #include<cstring> #include<string>#include<algorithm>#include<map>#include<queue>  #include<vector>using namespace std;  #define inf 0x3f3f3f3f  #define maxv 10005#define maxe 100005 int nume=0,head[maxv],e[maxe][3];void inline adde(int i,int j,int c)  {      e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;      e[nume++][2]=c;     e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;      e[nume++][2]=0;  }  int ss,tt,n,m;  int vis[maxv],lev[maxv]; bool bfs()  {      for(int i=0;i<maxv;i++)      vis[i]=lev[i]=0;      queue<int>q;      q.push(ss);      vis[ss]=1;      while(!q.empty())      {          int cur=q.front();          q.pop();          for(int i=head[cur];i!=-1;i=e[i][1])          {              int v=e[i][0];              if(!vis[v]&&e[i][2]>0)              {                  lev[v]=lev[cur]+1;                  vis[v]=1;                  q.push(v);              }          }      }      return vis[tt];  }  int dfs(int u,int minf)  {      if(u==tt||minf==0)return minf;      int sumf=0,f;      for(int i=head[u];i!=-1&&minf;i=e[i][1])      {          int v=e[i][0];          if(lev[v]==lev[u]+1&&e[i][2]>0)          {              f=dfs(v,minf<e[i][2]?minf:e[i][2]);              e[i][2]-=f;e[i^1][2]+=f;              sumf+=f;minf-=f;          }      }      if(!sumf) lev[u]=-1;      return sumf;  }  int Dinic()  {      int sum=0;      while(bfs())sum+=dfs(ss,inf);      return sum;  }  vector<int>a[200];int pig[1005];int L[1005];int main(){    memset(head,-1,sizeof(head));    scanf("%d%d",&m,&n);    ss=0,tt=n+1;    for(int i=1;i<=m;++i) scanf("%d",&pig[i]);    for(int i=1;i<=n;++i)    {        int x,y;        scanf("%d",&x);        while(x--)        {            scanf("%d",&y);            a[i].push_back(y);        }        scanf("%d",&y);        adde(i,tt,y);    }    for(int i=1;i<=n;i++)    for(int j=0;j<a[i].size();j++)    {        int v=a[i][j];        if(!L[v])        {            L[v]=i;            adde(ss,i,pig[v]);        }        else         {            adde(L[v],i,inf);            L[v]=i;        }    }    printf("%d\n",Dinic());    return 0;}

让我看到你们的双手

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 朋友微信借钱不还怎么办 微信上借钱不还怎么办 微信借钱不还怎么办 微信转账借钱不还怎么办 没欠条人家欠钱不给怎么办 欠货款被告没去怎么办 别人欠我钱不接电话怎么办 借给别人钱不接电话怎么办 欠钱的人玩消失怎么办 被婚介所骗了5万怎么办 贷款紧急联系人被骚扰怎么办 微信限制加好友怎么办 珍爱网的客服老打电话怎么办 百合网的人气是怎么办 苹果x来电不显示怎么办 苹果8黑屏没反应怎么办 苹果六s开不了机怎么办 苹果6s突然黑屏怎么办 苹果6s黑屏了怎么办 苹果6s手机黑屏打不开怎么办 苹果6sp手机死机怎么办 苹果6s打不开机怎么办 6s开不了机怎么办 lg背光灯坏了怎么办 苹果6s屏幕变黄怎么办 苹果8背光坏了怎么办 苹果六背光坏了怎么办 苹果5s蓝屏死机怎么办 苹果6s突然黑屏怎么办? 苹果6s经常死机怎么办 苹果6s没有背光怎么办 苹果7白屏死机怎么办 苹果6p屏膜失灵怎么办 苹果7p屏幕卡死怎么办 苹果7p手机死机怎么办 苹果6s死机了怎么办啊 6s死机了关不了怎么办 爱疯7死机了怎么办 苹果11.4系统老死机怎么办 苹果6震动坏了怎么办 苹果6手机死机了怎么办