Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u

Submit
Status

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

Source

Croatia OI 2002 Final Exam - First day



最大流经典建图,有m个猪圈,n个顾客,m个猪圈的钥匙在n个顾客手中,n个顾客一次来卖猪,当他们打开过猪圈之后农场主可以将这些猪圈里的猪按照自己的意愿进行转移,求这n个顾客可以买到多少头猪



建立超级源点与超级汇点,超级源点指向每个猪圈到达的第一个顾客,随后的顾客与前一个顾客产生一条正无穷的边权,而从源点出来的边权就是该猪圈的猪的数目,因为猪圈打开过之后猪就可以转移,那么随后的边权就应该是无穷,因为之后这个猪圈中猪的数目是不确定的,但是超级汇点要与每一个顾客建边,边权就是该顾客的需求量



可以参照大牛的分析,非常详细

http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXN 2000
#define MAXM 50000
#define INF 10000000
struct node
{
int u,v,cap,flow,next;
}edge[MAXM];
int cur[MAXN],dis[MAXN],vis[MAXN];
int head[MAXN],pig[MAXN],want[MAXN];
vector<int>first[MAXN];
int m,n,top;
void init()
{
top=0;
memset(head,-1,sizeof(head));
for(int i=0;i<=m;i++)
first[i].clear();
}
void add(int u,int v,int w)
{
int i=-1;
for(i=head[u];i!=-1;i=edge[i].next)//判断是否有重边
{
if(edge[i].v==v)
break;
}
if(i==-1)//没有重边的话直接建图
{
node E1={u,v,w,0,head[u]};
edge[top]=E1;
head[u]=top++;
node E2={v,u,0,0,head[v]};
edge[top]=E2;
head[v]=top++;
}
else//重边就流量汇总
{
if(w!=INF) edge[i].cap+=w;
}
}
void getmap()
{
for(int i=1;i<=m;i++)
{
int u=first[i][0];
add(0,u,pig[i]);//超级源点与每个猪圈进行联系,边权为猪圈猪的数目
for(int j=0;j<first[i].size()-1;j++)
{
int x=first[i][j];//将第一个顾客与后来的顾客产生联系
int y=first[i][j+1];
add(x,y,INF);
}
}
for(int i=1;i<=n;i++)
add(i,n+1,want[i]);//超级汇点与每一个顾客链接
}
void input()
{
int t,a;
for(int i=1;i<=m;i++)
scanf("%d",&pig[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&a);
first[a].push_back(i);//first[a][0]就是第一个顾客
}
scanf("%d",&want[i]);
}
}
bool bfs(int s,int e)
{
memset(vis,0,sizeof(vis));
memset(dis,-1,sizeof(dis));
queue<int>q;
while(!q.empty()) q.pop();
q.push(s);
vis[s]=1;
dis[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
node E=edge[i];
if(!vis[E.v]&&E.cap>E.flow)
{
vis[E.v]=1;
dis[E.v]=dis[E.u]+1;
if(E.v==e) return true;
q.push(E.v);
}
}
}
return false;
}
int dfs(int x,int a,int e)
{
if(a==0||x==e)
return a;
int flow=0,f;
for(int i=cur[x];i!=-1;i=edge[i].next)
{
node& E=edge[i];
if(dis[x]+1==dis[E.v]&&(f=dfs(E.v,min(a,E.cap-E.flow),e))>0)
{
E.flow+=f;
edge[i^1].flow-=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
}
int MAXflow(int s,int e)
{
int flow=0;
while(bfs(s,e))//是否可以增广
{
memcpy(cur,head,sizeof(head));
flow+=dfs(s,INF,e); //printf("%d\n",flow);
}
return flow;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
init();
input();
getmap();
printf("%d\n",MAXflow(0,n+1));
}
return 0;
}

poj--1149--PIGS(最大流经典建图)的更多相关文章

  1. [poj] 1149 PIGS || 最大流经典题目

    原题 题目大意 给你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 ...

  2. poj 1149 PIGS【最大流经典建图】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18727   Accepted: 8508 Description ...

  3. POJ 1149 - PIGS - [最大流构图]

    Time Limit: 1000MS Memory Limit: 10000K Description Mirko works on a pig farm that consists of M loc ...

  4. POJ1149 最大流经典建图PIG

    题意:       有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ...

  5. poj 1149 pigs ---- 最大流

    题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板. #include <iostream> #include& ...

  6. POJ 2226 最小点覆盖(经典建图)

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8881   Accepted: 3300 Desc ...

  7. poj 1149 pigs(最大流)

    题目大意:迈克在农场工作,农场有 m 个猪舍,每个猪舍有若干只猪,但是迈克不能打开任何一间猪舍.有 n 个顾客前来购买,每个顾客有最大的购买数量,每个顾客可以购买某些猪舍的猪,且顾客可以打开这些猪舍, ...

  8. hdoj--5093--Battle ships(二分图经典建图)

    Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  9. poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新

    题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...

随机推荐

  1. 【BZOJ 1269】 [AHOI2006]文本编辑器editor

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] /* [move k] 指令.直接 把pos改成k.表示改变光标位置 [insert n s],在pos后面插入一个长度为n的字符串 ...

  2. Qt之字典划词

    简述 相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! ...

  3. [Transducer] Make an Into Helper to Remove Boilerplate and Simplify our Transduce API

    Our transduce function is powerful but requires a lot of boilerplate. It would be nice if we had a w ...

  4. otto源代码分析

    otto这个开源项目是一个event bus模式的消息框架.用于程序各个模块之间的通信.此消息框架能够使得各个 模块之间降低耦合性. 此项目是支付公司square一个开源项目,项目托管于github ...

  5. 怎么样才算是精通 C++?

    C++是一门非常奇妙的语言.让人又爱又恨. 在知乎上看到的一个帖子.怎么样才算是精通C++,这里节选一些精彩的回复. 链接:http://www.zhihu.com/question/20201972 ...

  6. 9、包、访问控制、import、static、static代码块、final、抽象类、接口、instanceof、多态

    1.包 三级命名:公司的尾缀(com).公司名字(baidu).业务(Sale) java.lang:默认包:String.Math,Object,System java.util:工具包 java. ...

  7. Conditionals

    1. Modulus operator (%) The modulus operator works on integers and yields the remainder when the fir ...

  8. PowerDesigner怎么调出工具箱?

    PowerDesigner怎么调出工具箱? 如图操作:

  9. 安卓通过Json注册登录

    对于刚开始做安卓的来说,可能一个好的Demo比什么都来得快,但是最近在做安卓登录注册的时候,发现基本找不到我想要的东西,无奈只好硬着头皮做,好在不负付出,终于搞定,也算是给自己一个交待. 从结构上说, ...

  10. 提高realm存储速率

    我的数据量大约有2.5M,但是完全存储到数据库差不多用了11秒,有没有比较好的方法提高存储效率 提高realm存储速率 >> android这个答案描述的挺清楚的:http://www.g ...