题解 POJ1149 Pigs
先翻译一下吧(题面可以在原OJ上找)
Mirko在一个由M个锁着的猪舍组成的养猪场工作,Mirko无法解锁任何猪舍,因为他没有钥匙。客户纷纷来到农场。他们每个人都有一些猪舍的钥匙,并想购买一定数量的猪。
有关计划在特定日期访问农场的客户的所有数据都可以在清晨获得Mirko,以便他可以制定销售计划以最大化销售的猪数量。
更准确地说,程序如下:顾客到达,打开他有钥匙的所有猪舍,Mirko将所有未开封的猪舍中的一定数量的猪卖给他,如果Mirko想要的话,他可以将剩余的猪重新分配到解锁的猪舍。
每个猪舍都可以放置无限数量的猪。顾客来的顺序不能改变,猪舍在顾客走后锁上。
编写一个程序,找出当天可以卖出的最大猪数。
解析
这确实是网络流建图好题。
首先,顾客来的顺序很重要,
因为当一个拥有猪舍X的钥匙的顾客i来后,
下一个拥有X的钥匙的顾客j实际上也能买到i能买到的猪(因为其他猪舍的猪可以在i买后调整到X中)。
因此,将j和i连边即可,流量为INF。
然后,若i是第一个打开X的人,就将i和汇点T连边,流量为X的初始猪数。
最后,将源点与每个顾客连边,流量为顾客最多买的猪,
再跑最大流就行了!
上AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; inline int read(){
int sum=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){sum=sum*+ch-'';ch=getchar();}
return f*sum;
} const int INF=0x3f3f3f3f;
struct node{
int next,to,w;
}e[];
struct cus{
int ksum;/*钥匙数*/
int key[];/*钥匙*/
int sum;/*买猪的最大数*/
}c[];
int n,m,s,t;
int a[];
int head[],cnt=;
int d[],las[]/*i猪舍的上一个顾客*/; void add(int x,int y,int w){
// printf("from: %d to: %d\n",x,y);
e[++cnt].to=head[x];
e[cnt].next=y;
e[cnt].w=w;
head[x]=cnt;
} bool bfs(){
queue <int> que;
memset(d,,sizeof(d));
que.push(s);
d[s]=;
while(!que.empty()){
int x=que.front();
que.pop();
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(!e[i].w||d[k]) continue;
d[k]=d[x]+;
que.push(k);
}
}
return d[t];
} int dfs(int x,int mi){
if(x==t||!mi) return mi;
int ret=,a=;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(!e[i].w||d[k]!=d[x]+) continue;
ret=dfs(k,min(mi,e[i].w));
a+=ret;mi-=ret;
e[i].w-=ret;
e[i^].w+=ret;
if(!mi) break; }
if(a) d[x]=-;
return a;
} void DINIC(){
int ans=;
while(bfs()){
int ret=dfs(s,INF);
ans+=ret;
}
printf("%d\n",ans);
} int main(){
m=read();n=read();
s=n+;t=n+;
for(int i=;i<=m;i++){
a[i]=read();
}
for(int i=;i<=n;i++){
c[i].ksum=read();
for(int j=;j<=c[i].ksum;j++){
c[i].key[j]=read();
}
c[i].sum=read();
add(s,i,c[i].sum);
add(i,s,); //与源点连边
}
for(int i=;i<=n;i++){
for(int j=;j<=c[i].ksum;j++){
int k=c[i].key[j];
if(!las[k]){
add(i,t,a[k]);
add(t,i,);
}
else{
add(i,las[k],INF);
add(las[k],i,);
}
las[k]=i;
}
}
DINIC();/*最大流*/
return ;
}
题解 POJ1149 Pigs的更多相关文章
- POJ1149 PIGS 【最大流量】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16555 Accepted: 7416 Description ...
- poj1149 PIGS 最大流(神奇的建图)
一开始不看题解,建图出错了.后来发现是题目理解错了. if Mirko wants, he can redistribute the remaining pigs across the unlock ...
- POJ1149 PIGS 【最大流 + 构图】
题目链接:http://poj.org/problem?id=1149 PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- POJ1149 PIGS [最大流 建图]
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20662 Accepted: 9435 Description ...
- POJ1149 PIGS (网络流)
PIGS Time Limit: 1000MS M ...
- POJ1149 PIGS
想了好久啊...(#-.-) 开始想到m*n个点的构图,明显超时,于是考虑压缩节点个数 我们发现每个猪圈最后被有且只有一个人调整,于是想到对于一个人,连接他能调整的每个猪圈的上一个控制人.(不懂可以开 ...
- POJ1149 PIGS(最大流)
题意: 有一个人,他有m个猪圈,每个猪圈里面有一定数量的猪,但是每个猪圈的门都是锁着的,他自己没有钥匙,只有顾客有钥匙,一天依次来了n个顾客,(记住是依次来的)他们每个人都有一些钥匙,和他 ...
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- POJ1149:PIGS——题解
http://poj.org/problem?id=1149 题目大意: Mirko有M个猪圈和N个客户,猪圈里有特定数量的猪,每个客户按照顺序来买猪,他们只能打开他们能打开的猪圈,然后取走一些猪(上 ...
随机推荐
- GTID复制
什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能.GTID是事务提交时创建分配 ...
- redis 主从、哨兵、集群
出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...
- MySQL中的主键约束和外键约束
1.主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如 ...
- 6.Bash的功能
6.Bash的功能本章介绍 Bash 的特色功能.6.1 Bash的启动 bash [长选项] [-ir] [-abefhkmnptuvxdBCDHP] [-o 选项] [-O shopt 选项] [ ...
- 基于APR模式的Tomcat8环境部署
1.版本信息 组件名 版本号 jdk 1.8.111 tomcat 8.5.9 apr 1.6.3 apr-iconv 1.2.2 apr-util 1.6.2 tomcat-native 1.2.1 ...
- 分库分布的几件小事(四)分库分表的id主键生成
1.问题 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持.所以这都是你实际生产环境中必须考虑的问 ...
- flex整页布局
使用flex进行整页的三列布局,flex:1下的子元素无法铺满父级.给flex:1元素,添加stretch拉伸 display: flex; align-content: stretch; align ...
- Python单元测试框架unittest重要属性 与 用例编写思路
前言 本文为转载,原文地址作者列举python unittest这个测试框架的主要属性和 测试用例思路 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行, ...
- SSH安装配置
一.环境准备 二.SSH配置 1.root用户进入home目录,确实有无隐藏文件夹 .ssh cd ~ ls -lrta 2.有,则跳过本步骤:没有,执行如下命令 ##根据提示输入当前用户密码 ssh ...
- java_day06_java高级特性
Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...