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 ...
随机推荐
- css清除浮动clearfix:after的用法详解
如果外部有一个div容器,其内部div容器设置了float样式,则外部的容器div因为内部没有clear,导致不能撑开.解决方法: CSS代码: 复制代码 代码如下: .clearfix:after ...
- 第一次玩github,第一个开源小项目——xxoo
引言 由于最近的工作写代码比较少,这让LZ产生了一丝危机感.于是便想找一个办法可以没事自己写写代码,自然而然就想到了github.接下来便是一阵捣鼓的过程,其实整个过程很快,主要过程就是注册一个账号, ...
- WCF 学习笔记一
wcf服务的细节: 1.新建项目的时候有wcf服务应用程序和wcf服务库,两者区别在于前者可以寄宿在IIS上,而后者只能给其他项目使用,可以寄宿在控制台程序.窗体程序等等. 相关定义的链接 http: ...
- Linux入门基础(四):Linux网络基本配置
网络基础 ip编址 ip编址是一个双层编址方案(网络部分和主机部分),一个ip地址标识一个主机(或一个网卡接口) 现在应用最广泛的是IPv4编址,已经开始逐渐向IPv6编址切换 IPv4地址32位长, ...
- .net中 多线程 笔记(基础)
1. 在进程中可以有多个线程同时执行代码.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把 ...
- 前端基础之CSS(总结)
css学什么?? 主要学习选择器和属性,选择器是去找到标签的位置,属性是给标签增加需要的样式. CSS选择器 1.基本选择器: 1.标签选择器 2.ID选择器 3.类选择器(class="c ...
- 我看微软收购GitHub
今天是微软收购GitHub的第三天,之前很多人担心被微软收购的GitHub会步Skype,诺基亚等企业的后尘,凡此种种我觉得更多人的担心是:GitHub不再开源免费罢了. GitHub今年4月刚成立十 ...
- gitlab+jenkins持续集成(三)
构建: 需要将jenkins服务器上 jenkins用户的公钥发送给 目标服务器的gs用户,使得在jenkins上能用gs免密登录目标服务器 复制密钥到目标机器上(需要登录到的机器) ssh-co ...
- Spring入门学习笔记(3)——事件处理类
目录 Spring中的事件处理 Spring内建事件 监听Context事件 Example 自定义Spring事件 Spring中的事件处理 ApplicationContext 是Spring的核 ...
- ats 分层缓存
了解缓存层次结构 缓存层次结构由彼此通信的缓存级别组成.ats支持多种类型的缓存层次结构. 所有缓存层次结构都识别父和子的概念. 父缓存是层次结构中较高的缓存, ats可以 将请求转发到该缓存.子缓存 ...