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. 重载和const形参

    1.int lookup(string p); 2.int lookup(const string p);//同1 3.int lookup(string *);//传入一个指针,指针指向string ...

  2. 题解 P3200 【[HNOI2009]有趣的数列】

    说起来这是今天第三道卡特兰数了... 楼上的几篇题解好像都是直接看出这是卡特兰数,所以我就写一下为什么这道题可以用卡特兰数吧. 考察这样相邻的两项:\(a_{2i-1}\)与\(a_{2i}\),根据 ...

  3. 小A点菜 水题 dp 背包

    基本上还是01背包,首先注意必须正好花光钱,所以初始化时除了dp[0]以外其他都要设置成inf,然后因为求方案数,所以基本方程为dp[i] = dp[i-x] + dp[i],再根据inf进行一些特殊 ...

  4. asp.net C# 获取网页源代码的几种方式

    1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text ...

  5. Material Design学习之 Button(具体分析,传说中的水滴动画)

    转载请注明出处:王亟亟的大牛之路 上一篇大致介绍了Material Design的一些基本概念传送门:http://blog.csdn.net/ddwhan0123/article/details/5 ...

  6. m_Orchestrate learning system---二十六、动态给封装好的控件添加属性

    m_Orchestrate learning system---二十六.动态给封装好的控件添加属性 一.总结 一句话总结:比如我现在封装好了ueditor控件,我外部调用这个控件,因为要写数据到数据库 ...

  7. Python 序列化处理

    序列化 文件为dump 字符串为dumps dumps()方法返回一个str,内容就是标准的JSON loads()方法将其还原 在程序运行的过程中,所有的变量都是在内存 d = dict(name= ...

  8. Pickling

    Pickle translates almost any type of object into a string. pickle.dumps takes an object as a paramet ...

  9. String slices

    String slices A segment of a string is called a slice. Selecting a slice is similar selecting a char ...

  10. BZOJ 2342 Manacher

    思路: 首先用manacher可以求出以i和i+1中间为对称轴,最长回文串能扩增的长度p[i]. 然后4*(y-x)能更新答案,当且仅当y≤x+p[x]/2且y-p[y]≤x. 按i-p[i]将所有点 ...