1391: [Ceoi2008]order

有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润


  关于建图和思路

  刚开始看这道题的时候十分纠结,任务的做与不做,应当是典型的最小割取舍模型

  然而买机器和租机器,又是常见的最小费用最大流模型的标志

  进一步思考,对于每一对如下关系(任务)-(机器)

  一共有三种处理方法:

  1)任务不做

  2)租用机器

  3)购买机器

  好像看出了点眉目,对于第一种情况割掉做任务的收益边其他保留

  对于第二种情况割掉租用机器的费用边 第三种情况割掉购买机器的费用边

  于是我们可以将s连接每一个任务,每台机器连接t,每个任务和每个机器之间连接租用的费用

  这样图就建好了,再体会一下觉得真的很有趣

  如果说前几道变形题运用的是s,t的多种含义的话,我认为这道题就是将边的含义多重化

  既可以表示割了就得不到保留就仍可以拥有的收益,又可以表示割了就需要付出不割就什么都不干的费用


  

  具体实现过程——Dinic的时空优化

  然而这道题的数据范围有1200,用普通的Dinic是过不了的

  于是开始了漫长艰辛的优化之路 (捂脸熊

  

  首先点开hzwer学长的blog,发现了一个叫做当前弧优化的东西

  大概就是每次dfs的时候对于每一个点假设上次做到第x条边,这条边是做完之后的容量还大于0

  第二次做的时候前x-1条是没必要做的

  因为要不就是都不符合条件的边,就算符合也将所有的容量都已经挖掉了

  所以直接从“当前弧”开始做就可以了 (好形象啊

  第二个优化是dfs做完返回值前我们可以加一道特判:

  如果当前点扫下来之后积累的所有流量都为0,说明这一点出去所有的边都不具有可用的容量

  这个时候下一次就没必要再到这个点来了

  于是将dis[p]赋成一个乱七八糟的东西(但是切记不要赋-1啊,万一到s点去了怎么办啊TAT

  虽然说跳出了之后就不可能再进来了 但是这种东西写这里很虚啊...

  

  第三个优化是空间优化,这道题瞄了一眼空间限制64MB吓傻,我粗略估计了一下边的数组,大概有近50MB

  也就是说我再开一个可能就开不下了...

  这次比较幸运可万一考试的时候限制正好卡在那里怎么办?

  发现了一个rec数组完全不用开...rec数组在整个过程中的应用只有一条语句

  然而实际上如果我们的边下标从0开始计,rec数组有一个很奇妙的性质就是rec[j] = j ^ 1(异或)

  平时的题我不愿意去用因为一旦下标从0开始计意味着写得很熟练的

  while j<>0 do 就要改写法了,并且link,next这些数组初值都要重新赋了

  但是起码知道这样一个优化方法也是好的 说不定在考试的时候适用呢

  毕竟rec数组只是为了书写方便,而异或的方法不仅用起来爽而且时间空间上都有节省


  加油吧

  17/.Apr.

  

  

[BZOJ1391]解题报告|网络流的又一类建图&Dinic的若干优化的更多相关文章

  1. [BZOJ3275]Number解题报告|网络流

    Description 有N个正整数,需要从中选出一些数,使这些数的和最大.若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c*c2:gcd(a,b)=1 这道 ...

  2. P3376 网络流-最大流模板题(Dinic+当前弧优化)

    (点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...

  3. ACM-ICPC 2017 Asia HongKong 解题报告

    ACM-ICPC 2017 Asia HongKong 解题报告 任意门:https://nanti.jisuanke.com/?kw=ACM-ICPC%202017%20Asia%20HongKon ...

  4. joj 2453 candy 网络流建图的题

    Problem D: Candy As a teacher of a kindergarten, you have many things to do during a day, one of whi ...

  5. POJ 1161 Walls【floyd 以面为点建图】

    题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...

  6. P5471- K-D tree优化建图-弹跳

    P5471- K-D tree优化建图-弹跳 优化建图是一种思想. 题意 有\(n\)个城市分布在小鸟岛上,有\(m\)个弹弓分布在这些城市里.因为弹弓体积大,固定麻烦,所以每个弹弓只能把小鸟弹飞到一 ...

  7. 【解题报告】 Leapin' Lizards HDU 2732 网络流

    [解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...

  8. [ZOJ2341]Reactor Cooling解题报告|带上下界的网络流|无源汇的可行流

    Reactor Cooling The terrorist group leaded by a well known international terrorist Ben Bladen is bul ...

  9. [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec  Memo ...

随机推荐

  1. Bit-map法处理大数据问题

    问题引入: 1.给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?2.给定一个千万级别数据量的整数集合,判断哪些是重复元素.3.给 ...

  2. 如何从“点子”落地到“执行”?—完整解析1个手游传播类mini项目的进化

    本文来自网易云社区 作者:林玮园 从点子到落地,是不确定到确定的过程,是从模糊概念到具体现实的实现过程.无论什么点子,在落地变现的过程中都会有很多疑问产生. 首先,不确定点子本身是否成立.点子的背后是 ...

  3. 活动的生命周期 Android

    1.运行程序 onCreate().onStart()和 onResume() 2.跳转到非弹框视图控制器 onPause()和 onStop() 返回上一个视图控制器(没被回收) onRestart ...

  4. 正则表达式 Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  5. javascript中容易出bug的语句

    一.forEach方法 forEach方法中没法用continue来实现跳过单句到下一次循环,如果要跳到下一次循环,要用return关键字,如果想直接跳出forEach循环,具我所知的,要throw一 ...

  6. LeetCode 622——设计循环队列

    1. 题目 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列 ...

  7. Flask 学习笔记(二):RESTful API

    概括 URL:需要操作的对象,也就是资源 HTTP method:我要对该对象做什么(POST 增.DELETE 删.GET 查.PUT 和 PATCH 改) HTTP status code:操作的 ...

  8. BFS搜索

    参考博客:[算法入门]广度/宽度优先搜索(BFS) 适用问题:一个解/最优解 重点:我们怎么运用队列?怎么记录路径? 假设我们要找寻一条从V0到V6的最短路径.(明显看出这条最短路径就是V0-> ...

  9. 山科SDUST OJ Problem J :连分数

    Problem J: 连分数 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2723  Solved: 801[Submit][Status][Web B ...

  10. HDFS集群和YARN集群

    Hadoop集群环境搭建(一)   1集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主要 ...