【poj1149】 pigs 网络流最大流问题
描述 Description
尼克在一家养猪场工作,这家养猪场共有M间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍,客户们从早上开始一个接一个来购买生猪,他们到达后首先用手中的钥匙打开他所能打开的全部猪舍,然后从中选取他要买的生猪,尼克可以在此期间将打开的猪舍中的猪调整到其它开着的猪舍中,每个猪舍能存放的猪的数量是没有任何限制的。买完猪后客户会将他打开的猪舍关上。
好在尼克事先知道每位客户手中有哪些钥匙,要买多少猪,以及客户到来的先后次序。请你写一个程序,帮助尼克求出最多能卖出多少头生猪。
输入格式 Input Format
输入文件的第一行包含两个整数M和N,1≤M≤1000,1≤N≤100,M为猪舍的数量,N为客户人数,猪舍的编号为1到M,客户的编号为1到N。
输入文件第二行包含M个空格隔开的整数,依次表示每个猪舍中的生猪数量,每个整数大于等于0,且小于等于1000。
接下来的N行每行表示一位客户的购买信息,第I个客户的购买信息位于第I+2行,
其格式如下:
A K1 K2……KA B
它表示该客户共有A把钥匙,钥匙编号依次为K1 K2……KA,且K1<K2<……<KA,B为该客户要买的生猪的头数。
输出格式 Output Format
输出文件仅有一行包含一个整数,表示尼克最多能卖出的生猪的头数。
样例输入 Sample Input
3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6
样例输出 Sample Output
7
时间限制 Time Limitation
1s
注释 Hint
1s
来源 Source
poj 1149
众所周知网络流难在建图。这道题我刚开始以为是源点连人【权值为需求数】,人连房间【权值为需求数】,房间汇点【是猪的个数】。然而建完图连手推样例都不行,GG。
顺手翻了翻hzwer.com,然后就找到了,发现一个神犇的建图方法:
1.每个顾客向汇点连接他的需求数
2.对于每个猪圈,源点向第一个打开他的顾客连一条权值为猪数量的边
3.每个顾客向下一个顾客连接一个权值为正无穷的边
对于样例,我们可以建图:
以顾客为点,如图所示
【其中的4是猪圈1+2的和,因为他开了两个】最大流为7,符合样例
为什么这样建图?看题中所给的条件:每个顾客打开门后,尼克可以把猪迁移到开的房间。那么显然一个顾客对后面的顾客有影响。那么进入每个顾客的流量显然是这个顾客第一个打开的所有猪舍的和,这样向下一个顾客流,就相当于把猪的位置调换了。
AC代码:
#include<bits/stdc++.h>
#define ll long long
#define INF 2100000000
using std::min;
using std::cin;
using std::cout;
using std::endl; int n,m;
int q[];
int ans=;
int len=;
int s,t;
int level[];
int rev[];
int vis[];
int lin[];
int a[];
int ha=; struct qaq
{
int nt,y,v;
}e[]; char buf[<<],*fs,*ft;
inline char getc(){ return (fs==ft && (ft= (fs=buf) + fread(buf,,<<,stdin) , fs==ft) )?:*fs++; }
int read()
{
char ch=getc();int k=,f=;
while(!isdigit(ch)) { if(ch=='-') f=-; ch=getc(); }
while(isdigit(ch)) { k=(k<<)+(k<<)+ch-''; ch=getc(); }
return k*f;
} void insert(int x,int y,int v)
{
e[++len].nt=lin[x]; lin[x]=len; e[len].v=v; e[len].y=y; rev[len]=len+;
e[++len].nt=lin[y]; lin[y]=len; e[len].v=; e[len].y=x; rev[len]=len-;
} bool make_level()
{
int head=,tail=;
q[]=s;
memset(level,-,sizeof(level));
level[s]=;
while(head<tail)
{
int x=q[++head];
for(int i=lin[x];i;i=e[i].nt)
{
if(e[i].v && level[e[i].y]==-)
{
level[e[i].y]=level[x]+;
q[++tail]=e[i].y;
}
}
}
return level[t]>=;
} int max_flow(int k,int flow)
{
if(k==t) return flow;
int maxflow=;
int v;
for(int i=lin[k];i && maxflow<flow;i=e[i].nt)
if(e[i].v && level[e[i].y]==level[k]+)
if(v=max_flow(e[i].y,min(e[i].v,flow-maxflow)))
maxflow+=v , e[i].v-=v , e[rev[i]].v+=v;
if(!maxflow) level[k]=-;
return maxflow;
} void dinic()
{
int v;
while(make_level())
while(v=max_flow(s,INF))
ans+=v;
} int main()
{
//freopen("a.txt","r",stdin);
m=read();n=read();//m is pig
//cout<<n<<' '<<m<<endl;
memset(vis,,sizeof(vis));
s=;
t=n+;
for(int i=;i<=m;i++) a[i]=read();
for(int i=;i<=n;++i)
{
int key=read();
for(int j=;j<=key;++j)
{
int val=read();
if(!vis[val]) insert(s,i,a[val]);
else insert(vis[val],i,INF);
vis[val]=i;
}
key=read();
insert(i,t,key);
}
//cout<<12357<<endl;
dinic();
printf("%d\n",ans);
return ;
}
【poj1149】 pigs 网络流最大流问题的更多相关文章
- POJ1149 PIGS (网络流)
PIGS Time Limit: 1000MS M ...
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- 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 ...
- POJ 1149:PIGS 网络流经典题
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18345 Accepted: 8354 Description ...
- POJ1149 PIGS [最大流 建图]
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20662 Accepted: 9435 Description ...
- POJ1149 PIGS
想了好久啊...(#-.-) 开始想到m*n个点的构图,明显超时,于是考虑压缩节点个数 我们发现每个猪圈最后被有且只有一个人调整,于是想到对于一个人,连接他能调整的每个猪圈的上一个控制人.(不懂可以开 ...
- POJ1149 PIGS 【最大流量】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16555 Accepted: 7416 Description ...
- BZOJ1280 Emmy卖猪pigs 网络流
正解:网络流 解题报告: 传送门! 我网络流的基础题都还麻油做完就来做这个了,,,wsl,,, 首先想下最基础的构图方法 不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点 然后考虑怎么连边,首 ...
随机推荐
- JMeter学习笔记(六) 文件下载接口测试
本次测试的是文件下载接口,文件是PDF文档,步骤如下: 1.通过jmeter的录制功能,获取了文件下载接口的地址和参数,和其他的HTTP请求一样的配置 2.执行此接口后,察看结果树,点击下载接口的结果 ...
- ubantu 系统常见问题
1 搜狗输入法错误: 删除home路径下的 .config/SouGouP...整个文件夹并重启 2 ubantu系统更新:sudo apt-get update 获取最近更新的软件包列表 ...
- Android之SQLite总结
SQLite 是一个轻量级的数据库,常用于各种嵌入式设备当中.android 提供了SQLiteOpenHelper的抽象类用于帮助开发数据库.在实际使用中经常定义一个类继承SQLiteOpenHel ...
- 爬虫:Scrapy13 - 发送 email
虽然 Python 通过 smtplib 库使得发送 email 变得非常简单,Scrapy 仍然提供了自己的实现.该功能十分易用,同时由于采用了 Twisted 非阻塞式(non-blocking) ...
- xcrun: error: active developer path
xcrun: error: active developer path ("/Applications/Xcode 2.app/Contents/Developer") does ...
- oracle存储过程粗解
存储过程创建的语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围);变量2 类型(值 ...
- 设计模式之单例模式与工厂模式的Python实现(二)
2. 工厂模式 工厂模式是创建型设计模式的一种.核心的思想是,通过传递给类或函数某种产品的信息来创建产品并返回.当我们想得到产品a对象,只需把产品a的名字传递给工厂函数就能得到产品a对象.而核心思想的 ...
- Eclipse中一个Maven工程的目录结构 (MacOS)
1. 为什么写这篇文章 在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class.以后的日子中也没有机会注意到一个工程到底是怎么组织 ...
- NetScaler的cookieinsert和sourceip联合保持机制
NetScaler的cookieinsert和sourceip联合保持机制 使用NetScaler的cookieinsert和sourceip联合进行session保持机制即主用cookieinser ...
- TensorFlow 模型文件
在这篇 TensorFlow 教程中,我们将学习如下内容: TensorFlow 模型文件是怎么样的? 如何保存一个 TensorFlow 模型? 如何恢复一个 TensorFlow 模型? 如何使用 ...