传送门

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

最暴力的建图当然是源点连每个猪圈然后猪圈需要拆成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. Yii Ar model 查询

    Ar model 查询 参照表: CREATE TABLE tbl_user ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, username VA ...

  2. pandas.DataFrame.sample

    DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)[sourc ...

  3. 零基础python教程-Python解释器是什么?

    当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规范到解释器都是开源的 ...

  4. Java序列化及反序列化

    序列化概念: 1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道 ...

  5. PHP curl_getinfo函数

    curl_getinfo — 获取一个cURL连接资源句柄的信息 说明 mixed curl_getinfo ( resource $ch [, int $opt = 0 ] ) 获取最后一次传输的相 ...

  6. LR之分析

    1.Errors(错误统计) 每秒错误数:数值越小越好,通过这个图可以知道,当负载增加的时候,定位何时系统在负载下开始不稳定甚至出错. 2.Transaction(事务) average transa ...

  7. [CSP-S模拟测试]:回文串(hash+二分)

    题目描述 $ASDFZ$的机房中不仅有红太阳,还有蓝太阳和原谅色太阳.有一天,太阳们来到机房,发现桌上有不知道哪个蒟蒻放上的问题:令$F(A,B)$表示选择一个串$A$的非空前缀$S$和串$B$的非空 ...

  8. LINUX 文件合并,去重

    (1)两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个文件的并集(重复的行只保留一份)cat file1 file2 | sort | uniq > file32. 取出两个文 ...

  9. VUE不能对新增属性监测更新

    data () { return { data:{}, } }, method:{ if(data.code==0){ this.loading = false; this.data = data.d ...

  10. OSX 创建 randisk(或称 tmpfs)

    创建步骤: #!/bin/bash ramdisk_size_in_mb= mount_point=/private/tmp ramdisk_size_in_sectors=$((${ramdisk_ ...