文章目录

  • 题目描述
    • 数据范围
  • 解析
  • 代码

题目描述

尼克在一家养猪场工作,这家养猪场共有MMM间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍。有NNN个客户从早上开始一个接一个来购买生猪,他们到达后首先用手中的钥匙打开他所能打开的全部猪舍,然后从中选取他要买的猪,尼克可以在此期间将打开的猪舍中的猪调整到其它开着的猪舍中,每个猪舍能存放的猪的数量是没有任何限制的。买完猪后客户会将他打开的猪舍关上。

好在尼克事先知道每位客户手中有哪些钥匙,要买多少猪,以及客户到来的先后次序。请你写一个程序,帮助尼克求出最多能卖出多少头猪。

数据范围

M<=1000,N<=100M<=1000,N<=100M<=1000,N<=100

解析

关键在于建图的方法
直观感觉是把客户和他能开的猪圈连不限流的双向边,但是会出现时光倒流的bug
我的解决办法是只让猪圈和顾客连边,然后顾客按先后顺序暴力判断猪圈有交集则连一条单向不限流的边
但这样的理论最差边数是n2n^2n2,再加上点数为m,1e3级别,最差情况下 m2∗n2m^2*n^2m2∗n2似乎无法通过
然而实际上59ms跑的飞快
所以网络流一定要敢写
一个比较巧妙的建图方式是把猪圈x连向第一个打开x的顾客,以后再有打开x的顾客k,就从上一个打开x的顾客lst连一条到k的不限流的边
很巧妙
不过边数最差似乎还变成了n*m,更差了…

代码

(因为似乎没有实质的优化,所以还是暴力建图的码)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1205;
const int M=1e9;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m,s,t,num;
struct node{int to,nxt,cap;
}p[N*N*2];
int fi[N],cnt;
void addline(int x,int y,int cap){p[++cnt]=(node){y,fi[x],cap};fi[x]=cnt;p[++cnt]=(node){x,fi[y],0};fi[y]=cnt;
}
int col[N],cur[N];
queue<int>q;
int bfs(){memset(col,0,sizeof(col));col[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(col[to]||!p[i].cap) continue;col[to]=col[now]+1;q.push(to);}}return col[t];
}
int dfs(int x,int lim){if(x==t||!lim) return lim;int res=0;for(int &i=cur[x];~i&&lim;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||col[to]!=col[x]+1) continue;int add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(!res) col[x]=-1;return res;
}
int dinic(){int tot=0;while(bfs()){while(int tmp=dfs(1,2e9)) tot+=tmp;}return tot;
}
int key[106][1005],tot[106],need[106],id[106];
bool vis[1005];
bool ok(int x,int y){memset(vis,0,sizeof(vis));for(int i=1;i<=tot[x];i++) vis[key[x][i]]=1;for(int i=1;i<=tot[y];i++) if(vis[key[y][i]]) return true;return false;
}
int main(){memset(fi,-1,sizeof(fi));cnt=-1;m=read();n=read();s=++num;t=++num;for(int i=1;i<=m;i++){int x=read();++num;addline(s,num,x);}for(int i=1;i<=n;i++){tot[i]=read();id[i]=++num;for(int j=1;j<=tot[i];j++){key[i][j]=read();addline(key[i][j]+2,num,2e9);}need[i]=read();addline(num,t,need[i]);}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(ok(i,j)) addline(id[i],id[j],2e9);}}printf("%d",dinic());return 0;
}

YBTOJ:卖猪问题(网络流)相关推荐

  1. DHV展示故事经典 案例 卖猪借宿

    一男赶集卖猪,天黑遇雨,二十头猪(DHV展示)未卖成,到一农家借宿.         SF说:家里只一人不便.  (升起防护罩)       男:求你了大妹子,给猪一头.   (类似假性时间限制解除防 ...

  2. poj1149迈克卖猪问题(PIGS)

    /** 建图: <1>: 将顾客看作是除源点和汇点的结点,并且另设两个结点,源点和汇点 <2>:源点和每个猪圈的第一位顾客连边,边的权值是开始时猪圈中猪的数量 <3> ...

  3. 看得懂的猪周期,牧原们却不一定跨得过

    2022年2月16日,全国各省三元猪均价为12.34元/公斤,较昨日下跌0.13元/公斤,较上周同期猪价(2月9日)下跌1.20元/公斤. 在供需关系的支配下,猪肉价格上涨,散户蜂拥而上,猪肉供给大增 ...

  4. 谷实生物终止创业板上市:猪饲料收入占七成,殷学中家族控股公司

    12月15日,深交所披露的信息显示,2021年12月10日,谷实生物集团股份有限公司(下称"谷实生物")向深交所撤回在创业板上市申请文件的申请>.对此,深交所决定终止对谷实生 ...

  5. 转:090702猪啊猪

    关于猪的笑话及短信: 1.一男养一猪,特烦它,就想把它给扔了,但是此猪认得回家的路,扔了好多次都没有成功. 某日,此人又驾车弃猪. 当晚打电话给他的妻子问:"猪回来了吗?" 其妻曰 ...

  6. 那个卖猪肉的北大毕业生,曾经受尽嘲讽,现在身价过亿了

    点击上方"涛哥聊Python",选择"星标"公众号 重磅干货,第一时间送达 转自:视学算法 谁能想到呢,时隔20年,"北大屠夫"陆步轩再次冲 ...

  7. 100条关于猪的短信收藏吧

    1:北风又开始刮了,粗心的你总是这样,每次都让我提醒你多穿件衣服,可你也每次都是这样不屑地回答我说:我这么厚的猪皮是干嘛的?还怕那一点小风吗? 2:有人告诉我想家的时候看看天,想妈妈的时候看看月亮,想 ...

  8. [转载]100条关于猪的短信

    1:北风又开始刮了,粗心的你总是这样,每次都让我提醒你多穿件衣服,可你也每次都是这样不屑地回答我说:我这么厚的猪皮是干嘛的?还怕那一点小风吗? 2:有人告诉我想家的时候看看天,想妈妈的时候看看月亮,想 ...

  9. POJ1149 最大流经典建图PIG

    题意:       有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ...

最新文章

  1. 蓝牙模块引起电路干扰
  2. php异常处理的深入
  3. T183637-变异距离(2021 CoE III C)【单调栈】
  4. java输出一些内容到日志文件
  5. HGOI20190707 题解
  6. 能在手机播放的Flash代码
  7. 《Simbody Theory Manual》
  8. Linux之dd命令使用
  9. 如何在iPhone、iPad和Mac上查看照片的EXIF数据?
  10. 筛选DataTable数据的方法
  11. Linux工作队列实现机制
  12. JVM监控及诊断工具命令行篇之jstack
  13. PostgreSQL/pgsql生成随机的姓名的函数
  14. 如何高情商地在职场和生活中正确聊天
  15. 全球及中国回转窑扫描仪行业发展动态与前景趋势预测报告2022-2028年
  16. python scipy 计算黎曼ζ函数
  17. 一文读懂自然语言处理NLP(图解+学习资料)
  18. Autosar CPU core trust/Nontrust配置
  19. DROID-SLAM: 用于单目双目RGBD相机的深度视觉SLAM
  20. JDK中文API帮助文档【沈东良】

热门文章

  1. 数据挖掘算法之-关联规则挖掘(Association Rule)(购物篮分析)
  2. android tabhost黑色背景,android更改FragmentTabHost背景和文本颜色
  3. abp框架java,【Net】ABP框架学习之正面硬钢
  4. linux图形界面鼠标变成小手_加载Linux系统,树莓派变身桌面电脑
  5. 西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...
  6. matlab创建数组对象,MATLAB一维数组(向量)的定义
  7. linux开机自动挂载硬盘指定权限,Linux开机自动挂载硬盘
  8. vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观
  9. python函数参数那些事,关键字参数与位置参数
  10. 用php编写一个日志系统,php利用单例模式实现日志处理类库