POJ1149_PIGS
一共有n个猪圈,m个客人,一开始每个猪圈都有一定数量的猪猪。每个客人会打开一些猪圈,带走最多为某一个数量的猪猪,剩下的猪猪可以任意分配在这些开了的猪圈里面,然后重新关上。问所有的客人最多可以带走多少猪猪?
网络流建模。其实每个猪圈如果被人开过了,那么下次再有人来访问这个猪圈的时候,相当于从上一个人那里得到的流量,这样我们可以不考虑猪圈,只考虑客人建点即可,假设f[i]保存i个猪圈上一次是被哪一些客人打开的,那么第j个客人再来此猪圈的时候,相当于从上一个客人手中得到的猪猪了。
一开始源点为0,从那里得到初始猪猪个数的流量。最后就是跑最大流即可。
这样建模就可以A了。
召唤代码君:
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 2222
#define maxm 2222222
using namespace std; int next[maxm],to[maxm],c[maxm],first[maxn],edge;
int d[maxn],tag[maxn],pos[maxn],TAG=;
bool can[maxn];
int Q[maxm],bot,top;
int s,t,n,m,ans,a[maxn],f[maxn],A,B; void _init()
{
for (int i=; i<=n; i++) scanf("%d",&a[i]);
ans=s=,t=m+,edge=-;
for (int i=s; i<=t; i++) first[i]=-,f[i]=s;
} void addedge(int U,int V,int W)
{
edge++;
to[edge]=V,c[edge]=W,next[edge]=first[U],first[U]=edge;
edge++;
to[edge]=U,c[edge]=,next[edge]=first[V],first[V]=edge;
} bool bfs()
{
Q[bot=top=]=t,tag[t]=++TAG,d[t]=;
while (bot<=top)
{
int cur=Q[bot++];
for (int i=first[cur]; i!=-; i=next[i])
if (c[i^]> && tag[to[i]]!=TAG)
{
tag[to[i]]=TAG,can[to[i]]=false;
Q[++top]=to[i],d[to[i]]=d[cur]+;
if (to[i]==s) return true; }
}
return false;
} int dfs(int cur,int num)
{
if (cur==t) return num;
int tmp=num,k;
for (int i=first[cur]; i!=-; i=next[i])
if (c[i]> && tag[to[i]]==TAG && d[to[i]]==d[cur]- && !can[to[i]])
{
k=dfs(to[i],min(num,c[i]));
if (k) num-=k,c[i]-=k,c[i^]+=k;
if (!num) break;
}
if (num) can[cur]=true;
return tmp-num;
} int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
_init();
for (int i=; i<=m; i++)
{
scanf("%d",&A);
while (A--)
{
scanf("%d",&B);
if (!f[B]) addedge(f[B],i,a[B]);
else addedge(f[B],i,~0U>>);
f[B]=i;
}
scanf("%d",&A);
addedge(i,t,A);
}
while (bfs()) ans+=dfs(s,~0U>>);
printf("%d\n",ans);
}
return ;
}
POJ1149_PIGS的更多相关文章
- POJ1149_PIGS(网络流/EK)
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15721 Accepted: 7021 Description ...
随机推荐
- Object C学习笔记6-如何在Windows环境搭建Object C开发环境
1. 安装编译环境 Object C和其他很多语言一样,都需要有一个编译器.Object C 是在GCC下编译的.GCC(GNU Compiler Collection,GNU编译器集合),是一套由 ...
- 转载-30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)
原文:30分钟搞定后台登录界面(103个后台PSD源文件.素材网站) 目录 一.界面预览 二.PSD源文件预览 三.工具分享 四.资源说明 五.素材下载网站 六.下载 去年八月时要做一个OA系统为 ...
- JavaScript——引用类型之数组
前言 之前本菜打算在写完基本类型后写引用类型Object的,因为Object是引用类型的基础,其他的引用类型也是以Object为根本.只是关于对象的基本认识与简单操作确实可写的不多,打算之后与原型.原 ...
- 频繁请求报requests异常的处理
由于数据量的增大,调用接口的次数会增加. 当连续向目标网站发送多次request后,目标网站可能会认为是,恶意攻击. 于是会抛出requests异常. 测试代码: for i in range(200 ...
- JMeter做http接口压力测试
测前准备 用JMeter做接口的压测非常方便,在压测之前我们需要考虑这几个方面: 场景设定 场景分单场景和混合场景.针对一个接口做压力测试就是单场景,针对一个流程做压力测试的时候就是混合场景,需要多个 ...
- oracle vm virtualbox 保存虚拟系统,重装后使用
直接将VirtualBox VMs 文件夹打包,然后在新系统中装好virtualbox 解压virtualBox VMs ,在系统文件夹中找到 .vbox结尾的文件,点击, 就可以看到熟悉的系统出现在 ...
- Socket之简单的Unity3D聊天室__TCP协议
服务器端程序 using System; using System.Collections.Generic; using System.Linq; using System.Net; using Sy ...
- 用shell实现bat批处理的pause命令-追加改进
我参考了这个文章:用shell实现bat的pause http://linux-wiki.cn/wiki/zh-hans/%E7%94%A8shell%E5%AE%9E%E7%8E%B0bat%E7% ...
- Java non-javadoc
Java注释 non-javadoc 表示该处没有自己的注释, @see javax.servlet.Servlet#init() 参考see后面的链接 /* * (non-javadoc) * @s ...
- docker pull下来的镜像放哪儿了?
本机docker版本 docker –version Docker version 1.进入docker 目录 root@Rightsec:~# cd /var/lib/docker root@Rig ...