传送门

貌似是最大流建图优化入门题(可惜我还是不会)

最暴力的建图当然是源点连每个猪圈然后猪圈需要拆成n个点分给每个人这个必定是跑不过的

所以我们可以进行优化

很明显没有被动过的猪圈一直是不变的可以不用拆

然后两个顾客之间开了同一扇门可以互通有无的话那么他们之间可以连一条inf的边来进行这个操作

我们发现一个人打开多个没被打开过的猪圈可以直接把这些猪圈合并起来

所以最后我们从源点连出来的是顾客!

我们把所有猪圈之间的流动全部变成了边

所以最后我们的点数是N+2个

边数最多是M条(互通有无)

就可以解决这道题了

(神仙优化想不出想不出)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 20021225
#define ll long long
using namespace std; struct edge{int to,lt,f;}e[3020];
int in[110],cnt=1,s,t;
queue<int> que;
int dep[110];
void add(int x,int y,int f)
{
e[++cnt].to=y;e[cnt].lt=in[x];e[cnt].f=f;in[x]=cnt;
e[++cnt].to=x;e[cnt].lt=in[y];e[cnt].f=0;in[y]=cnt;
}
bool bfs()
{
while(!que.empty()) que.pop();
memset(dep,0,sizeof(dep));
dep[s]=1;que.push(s);
while(!que.empty())
{
int x=que.front();que.pop();
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to;
if(!dep[y]&&e[i].f)
{
dep[y]=dep[x]+1;
if(y==t) return 1;
que.push(y);
}
}
}
return 0;
}
int dfs(int x,int flow)
{
if(x==t||!flow) return flow;
int cur=flow;
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to;
if(dep[y]==dep[x]+1&&e[i].f)
{
int tmp=dfs(y,min(cur,e[i].f));
cur-=tmp;e[i].f-=tmp;e[i^1].f+=tmp;
if(!cur){dep[x]=-1;return flow;}
}
}
dep[x]=-1;
return flow-cur;
}
int dinic()
{
int ans=0;
while(bfs())
ans+=dfs(s,inf);
return ans;
}
int n,m,ltz[1001],pig[1001];
int main()
{
int a,c,k,i,j,tot;
scanf("%d%d",&m,&n);s=n+1;t=s+1;
for(i=1;i<=m;i++) scanf("%d",&pig[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&a);tot=0;
for(j=1;j<=a;j++)
{
scanf("%d",&k);
if(!ltz[k]) tot+=pig[k];
else add(ltz[k],i,inf);
ltz[k]=i;
}
scanf("%d",&c);
add(s,i,tot);add(i,t,c);
}
printf("%d\n",dinic());
return 0;
}

POJ1149PIGS的更多相关文章

  1. poj1149--PIGS(最大流)

    题意: 有m个猪圈 每个猪圈有不同数量的猪 [0, 1000]有n个顾客 每个顾客需要Bi头猪 有Ai个钥匙 能打开Ai个不同的猪圈顾客按顺序来买猪 只能买他有钥匙的猪 买完之后 这几个猪圈的猪可以相 ...

  2. poj1149PIGS——网络最大流

    题目:http://poj.org/problem?id=1149 不把猪圈当做点,而把顾客当作点,把猪当作边权(流量): 因为猪圈中的猪可流动,所以共用一个猪圈的人互相连边: 注意应该连成链的形式, ...

  3. poj--1149--PIGS(最大流经典建图)

    PIGS Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit Status D ...

随机推荐

  1. List接口和Set接口及其常用实现类概述

    一.List接口 List:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元 ...

  2. 前端框架和其他:1.谈谈你对http协议的认识。

    1.http是一种网络数据传输协议  hype text transfer protocol-超文本传输协议 2.传输什么:超文本(html文档) 3.协议遵守方,浏览器和服务器 4.一般的传输流程是 ...

  3. [转]解决win10下localhost打不开的问题

    博主刚开始玩Tornado,结果localhost都打不开,各种找寻解决方案,结论都是IIS服务器问题.然而win10下的解决方法居然没人写过...那就我来配图详解下. 打开控制面板--添加或删除程序 ...

  4. 01 spring security入门篇

    1. 环境搭建 使用SpringBoot搭建开发环境,只需在pom.xml添加如下依赖即可. <?xml version="1.0" encoding="UTF-8 ...

  5. manacher 和 扩展KMP

    manacher 和 扩展KMP 事实上,这两个东西是一样的. 考虑 manacher 的过程 我们实时维护最远扩展的位置 \(mx\) 以及这个回文串的回文中心 \(l\) ,那么显然当然位置如果没 ...

  6. 容器————vector

    目录 一.介绍 二.声明及初始化 三.方法 front find remove erase substr 一.介绍 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为 ...

  7. 攻防世界 WEB篇

    0x01 ics-06 查看源码发现:index.php 一开始直接用sqlmap跑了下没有发现注入,然后用brupsuite爆破参数 0x02 NewsCenter SQL注入中的POST注入,查阅 ...

  8. socket | tcp客户端 tcp服务器 udp客户端 udp 服务器 创建方法

    tcp服务器 #coding=utf-8 ''' 这里是tcp服务器端,要先启动 ''' import socket import threading bind_ip = "0.0.0.0& ...

  9. 尽量用类型化的常量替代预处理器的 #DEFINE 方法

    类型化常量 (TYPED CONSTANTS) #define ANIMATION_DURATION 0.3 这是一个预处理器指令,当编译器在代码中发现有 ANIMATION_DURATION 时,就 ...

  10. js中的$符

    js中的$代表什么意思呢? 首先js的作用是什么呢?是修饰网页动态内容的.那么修饰就需要定位主题,比如你把html比喻一个美女,让她唱一首歌.那么首先你要定位出是你想让哪个美女唱歌,通常我们用id来定 ...