poj--1149--PIGS(最大流经典建图)
| Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u | 
Description
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 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
Sample Input
3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6
Sample Output
7
Source
最大流经典建图,有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(最大流经典建图)的更多相关文章
- [poj] 1149 PIGS || 最大流经典题目
		原题 题目大意 给你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 ... 
- poj 1149 PIGS【最大流经典建图】
		PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18727 Accepted: 8508 Description ... 
- POJ 1149 - PIGS - [最大流构图]
		Time Limit: 1000MS Memory Limit: 10000K Description Mirko works on a pig farm that consists of M loc ... 
- POJ1149 最大流经典建图PIG
		题意: 有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ... 
- poj 1149 pigs ---- 最大流
		题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板. #include <iostream> #include& ... 
- POJ 2226 最小点覆盖(经典建图)
		Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8881 Accepted: 3300 Desc ... 
- poj 1149 pigs(最大流)
		题目大意:迈克在农场工作,农场有 m 个猪舍,每个猪舍有若干只猪,但是迈克不能打开任何一间猪舍.有 n 个顾客前来购买,每个顾客有最大的购买数量,每个顾客可以购买某些猪舍的猪,且顾客可以打开这些猪舍, ... 
- hdoj--5093--Battle ships(二分图经典建图)
		Battle ships Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ... 
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
		题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ... 
随机推荐
- C实现JAVA类似ArrayList的静态链接库
			文件结构: ArrayList.h:头文件 ArrayList.c:实现头文件中的功能 ArrayListTest.c:测试 ArrayList.h 头文件的基本框架: #ifndef _ARRAYL ... 
- UI布局【转】
			转载自: https://www.cnblogs.com/wangdaijun/p/5519459.html https://www.jianshu.com/p/f781c40df57c Good U ... 
- __weak修饰符
			前言 在 HAL 库中,很多回调函数前面使用__weak 修饰符. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”. 加上了__weak ... 
- redis为什么选择单线程工作模型
			1.先说一下为什么出现进程,线程 进程:在计算机发明之初就发现,在输入数据时(I/O速度慢),CPU是空闲的,这样就浪费了CPU资源,为了充分利用CPU资源,发明了进程,在输入程序A的数据时,程序B在 ... 
- Linux的中断和系统调用 & esp、eip等寄存器
			http://www.linuxidc.com/Linux/2012-11/74486.htm 一共三篇 中断一般分为三类: 1.由计算机硬件异常或故障引起的中断,称为内部异常中断: 2.由程序中执行 ... 
- google在线測试练习题3
			Problem The Latin alphabet contains 26 characters and telephones only have ten digits on the keypad. ... 
- IOS开发-经常使用站点集合
			1. https://developer.apple.com //苹果开发人员站点 2. https://itunesconnect.apple.com //itunes站点 3. ... 
- HDU 5297 Y sequence Y数列
			题意:给定正整数n和r.定义Y数列为从正整数序列中删除全部能表示成a^b(2 ≤ b ≤ r)的数后的数列,求Y数列的第n个数是多少. 比如n = 10. r = 3,则Y数列为2 3 5 6 7 1 ... 
- H5学习_番外篇_PHP数据库操作
			1. 文件操作 1.1 打开关闭文件 fopen() resource fopen ( string filename, string mode [, bool use_include_path [, ... 
- POJ 题目3321 Apple Tree(线段树)
			Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21566 Accepted: 6548 Descr ... 
