POJ 1149 PIGS 建图,最大流
题意:
你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开某一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 已打开的猪圈会被锁上。
问最多能卖几头猪
分析:
这个题明着想呢,肯定是要建N排点的,表示相同的猪圈的点连inf边,跑最大流的。
建那么多点肯定是会炸的。
在网络流中呢,如果我们做题的初步思路是最大流,那么肯定要将题目中问的直接问题抽象成水流,比如这道题,问最多的卖猪数,我们当然就要把猪的数量作为“流”,这是大家心照不宣的。
所谓建图呢?个人认为,网络流最终要的是“限制”二字,网络流的流量和连边就是一个个限制问题,所以我们要参透题目中给的限制问题,有时并不必要把图中的每一个关系都建边。
像这个题目中,猪圈里猪的数量是限制,每个人能打开的猪圈也是限制,买家的先后顺序也是限制,买猪的数量也是限制。所以我们只需要用这些限制构建模型,开始:
源点到每个猪圈来买的第一个人连一条容量为该猪圈里猪的数量的边(这个满足了第一、二个限制)
对于每个猪圈,第i个来买的人向第i+1个来买的人连一条容量为正无穷的边(这个满足了第三个限制)
每个人向汇点连一条容量为购买数量的边(这个满足了第四个限制)
网络流就是这样,严密合理得像一个故事一样。
一头猪,从猪圈出来经过几人之手最终被某个人买走,完成了他的使命。一单位流量从原点,流经一些人,最终流向汇点,也完成了它的使命。这边是对网络流的感性理解。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
const int N=,M=,inf=1e9;
struct node{int y,z,nxt;}e[N*M*];
int n,m,S,T,pg[M],nw[M],c=;
int q[N],h[N],d[N],vis[N];
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,,h[y]};h[y]=c;
} bool bfs(){
int f=,t=;ms(d,-);
q[t++]=S;d[S]=;
while(f<t){
int x=q[f++];
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==-&&e[i].z)
d[y]=d[x]+,q[t++]=y;
} return (d[T]!=-);
} int dfs(int x,int f){
if(x==T) return f;int w,tmp=;
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==d[x]+&&e[i].z){
w=dfs(y,min(f-tmp,e[i].z));
if(!w) d[y]=-;
e[i].z-=w;e[i^].z+=w;
tmp+=w;if(tmp==f) return f;
} return tmp;
} int dinic(){
int tot=;
while(bfs()) tot+=dfs(S,inf);
return tot;
} int main(){
scanf("%d%d",&m,&n);S=;T=n+;
for(int i=;i<=m;i++)
scanf("%d",&pg[i]);
for(int i=;i<=n;i++){
int a,b,x;scanf("%d",&a);
while(a--){
scanf("%d",&x);
if(!nw[x]) add(S,i,pg[x]),nw[x]=i;
else add(nw[x],i,inf),nw[x]=i;
} scanf("%d",&b);add(i,T,b);
} printf("%d",dinic());
return ;
}
最大流
POJ 1149 PIGS 建图,最大流的更多相关文章
- POJ 1149 PIGS(Dinic最大流)
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20738 Accepted: 9481 Description ...
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- 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 ...
- poj 1149 pigs ---- 最大流
题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板. #include <iostream> #include& ...
- poj 1149 PIGS【最大流】
建图:s向所有猪圈的第一个顾客连流量为这个猪圈里住的数量,然后对于之后每个来这个猪圈的顾客,由他前一个顾客向他连边权为无穷的边,然后每个顾客向t连流量为这个顾客购买上限的边.然后跑最大流 #inclu ...
- POJ 1149 PIGS 【最大流】
<题目链接> 题目大意:有一个养猪场,厂长没有钥匙,这个养猪场一共M个猪圈,N个顾客,每个顾客有一些猪圈的钥匙,每个顾客需要一些猪,问你厂长最多能卖多少猪?这里有个条件是,厂长可以在一个顾 ...
- POJ 1149 PIGS
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20579 Accepted: 9387 Description ...
- POJ 1149 PIGS (AC这道题很不容易啊)网络流
PIGS Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlo ...
随机推荐
- bootstrap-table 行合并和列合并,以及固定列宽度等问题
列合并和列宽度固定: .setWidth { table-layout: fixed; } .setWidth > thead > tr > th { width: 80px; } ...
- 强类型的HTML模板方法与直接显示模型
模型: public class Article { [Display(Name="文章")] public string ArticleID { get; set; } [Dis ...
- java笔记之IO2写操作
IO流的分类 流向: 输入流 读出数据 输出流 写出数据 数据类型 字节流 字节输入流 读取数据 inputstream 字节输出流 写出数据 outputstream 字符流 字符输入流 读取数据 ...
- Ruby - 创建自己的GEM
Log 1 创建自己的gem 背景:好奇gem包的用法,首先搞清楚什么是gem包.那我们就先来创建一个自己的gem包. 时间:2014-3-8 环境:Ubuntu + Ruby 1.9.3 记录:Ro ...
- centos 7添加快捷键
转自:http://www.cnblogs.com/flying607/p/5730867.html centos7中不自带启动终端的快捷键,可以自定义添加. 点击右上角的用户名,点击设置,在设置面板 ...
- ROS学习笔记九:ROS工具
ROS有各种工具可以帮助用户使用ROS.应该指出,这些GUI工具是对输入型命令工具的补充.如果包括ROS用户个人发布的工具,那么ROS工具的数量很庞大.其中,本文讨论的工具是对于ROS编程非常有用的辅 ...
- [POI2007]四进制的天平Wag
Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...
- static属性
static 属于全局,也就是类的属性 和方法,换句话说 一个类,不管有多少个实例,却只有一个全局变量 用static修饰的属性和方法称为静态属性和方法 需要注意的是 静态属性和方法属于类方法,加载类 ...
- 安装11g 数据库
出现问题解决: 1.首先确认下载的安装包完整性.2解压包的时候,按顺序解压,解压第一个包后,解压第二个包的时候,要把解压地址与解压第二包的地址要一样. 安装的时候,需要把两个压缩包都解压,并将目录wi ...
- performClick()方法的使用
performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) 例如: 添加Ctrl+s 快捷键 保存,并触发btnSave按钮事件 protected override bool ...