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 ...
随机推荐
- springMVC 定时器配置
1.在springMVC中加入 xmlns:task="http://www.springframework.org/schema/task" http://www.springf ...
- linux指令--用户和工作组管理
>>前言 Linux是一个多用户.多任务的操作系统,Linux系统的初衷之一就是满足多用户同时工作的需求,因此,linux需要具备很好的安全性,需要对用户进行管理,用户又分几种,管理 ...
- React 使用link在url添加参数(url中不可见)
1. 在要跳转页面添加<Link to={{ pathname: `/staffManagement/cardRecord`, state: {time: YYYY-MM-dd, name: s ...
- Matlab 图像的邻域和块操作
图像的邻域操作是指输出图像的像素点取值,由输入图像的某个像素点及其邻域内的像素,通常像素点的邻域是一个远小于图像本身尺寸.形状规则的像素块,如2×2,3×3正方形.2×3矩形等,或者近似圆形的多边形. ...
- MySQL锁定状态查看命令
1 show processlist; SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到 ...
- 洛谷 P2744 [USACO5.3]量取牛奶Milk Measuring
P2744 [USACO5.3]量取牛奶Milk Measuring 题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最 ...
- android仿最新版本号微信相冊--附源代码
更改排版为 markdown: http://blog.csdn.net/self_study/article/details/69397859
- 【Linux编程】socket编程
套接字是通信端点的抽象.文件描写叙述符用open函数创建,而套接字描写叙述符用socket函数创建.socket函数原型例如以下: int socket(int domain, int type, i ...
- [MST] Restore the Model Tree State using Hot Module Reloading when Model Definitions Change
n this lesson, we will set up Hot Module Reloading(HMR), making it possible to load new definitions ...
- c++ string类的完整实现!!!
本文实现了c++ STL中的basic_string模板类,当然.通过typedef也就实现了string类和wstring类.限于篇幅,实现代码中用到了标准库的char_traits模板类,本人自己 ...