《费用流——数与形的完美结合》

1.阐释费用流的求解原理,即通过不断最短路增广,并用dijistra进行改进,当然,这不是本文重点
2.例题1:给定一个由N个节点,若干条无向边组成的城市,某些节点处有一辆或多辆汽车,一辆汽车只能使用一次,可以行驶任意长度。 坐车和步行速度不同,坐车每个单位距离需要Ds的时间,步行每个单位距离需要Ws的时间。 给定一个长度为M的访问列表,要求从0号节点出发,依次访问列表中的每个节点,最后回到0号节点。可以选择坐车或步行,求完成任务所需的最短时间。
想法:很明显点与点之间连两种边,一种费用为d,流量限制为车辆数,一种没有流量限制,费用为w,将0号点拆为s和t,每个点拆为两个,s向b连一条边容量为出现次数,费用0,a向t连一条边容量为次数费用为0,a向b连一条容量无穷费用为0,跑最小费用最大流即可,
实际思路:很明显我的思路是错误的,因为从b点流出的流指不定就流到哪里了所以建模错误
分析一下题解,思路,题目是组合优化问题,首先考虑dp,然而dp有后效性(车只能用一次)明显可以通过流网络求解,题目存在若干限制:1.顺序经过各个列表顶点 2.每辆车只能用一次
同时,可以考虑从一个点到另一个点的方案两种:1.步行最短路 2.步行后到达某个节点后开车最短路,把方案看成决策,建立二分图(建模,要不在原图修改,要不建立二分图新图,本题中间顶多换一次车所以忽略过程可以建立二分图)左侧:列表中的点,右侧,车辆和0点(步行),s向左连(1,0),右向t(1,0),左右(1,费用(步行加车)),左向0,(1,步行),0向t(无穷,0),最小费用最大流即可(不做解释了就)
总结:题目限制向流量限制转化,关键是分析出转移方案
2.题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次
思路:限制:1.每个点顶多k次 2.每个给出区间只能选一次 目标:最大化价值
dp?状态多,建图把
首先离散化
添加一个0向1连,流量限制为k,串联序列,每个点前一条边表示使用次数,原点s向每个区间起始点的前一个点连,流量(1,-区间和),尾点向t(1,-区间和),跑最小费用流得到sum,ans=-sum/2,为什么这么做呢?根据费用流的性质,首先不会选超过k次,其次一个流总会从起点进尾点出,因为,,好吧我知道是错的,但不要喷我,再一次,流不知跑到哪里去了,,,
题解:神题,和那个雇员的网络流本质相同吧,很大脑洞,但关键是回归本质
题目特点:1.离散化后每一个区间覆盖的子区间连续,重述限制,每一个子区间选择最多k次
2.线性不等式添加松弛变量变为等式,再转化为流量平衡方程(回归本质) 3.列出不等式和目标函数(0,1)规划,由连续性可以考虑做差,发现每一个子区间正负各一次(添加首位两个0=0的等式,其他写成和为0的形式,正的流入负的流出),与流网络一一对应 4.建图:
这里的点就是流量平衡方程本身了(厉害吧),s向做差后右侧为正的点连右侧权值,负的向t连(方程中的正表示流出,负表示流入),有正的向有负的添加(1,-wi),辅助变量费用为0,求最小费用最大流取反就行了,
总结:知识点和思想很多,还是限制,没有思路时写出问题的数学形式,考虑限制,必要时把限制加紧,或者放开限制(添加辅助变量),回归问题的本质(流量平衡),连续性和做差,脑洞大的令我佩服,结合noi08的那道题,实际上一样的,都是列出线性规划不等式建模,被称为“数”性建模,
另外,值得一提的是,这类可以列出不等式的可以用线性规划的暴力算法,,根本无脑,效率不错,要学习一下
更多细节可以膜byvoid题解:https://www.byvoid.com/blog/noi-2008-employee/
网上的题解不太一样,将区间端点离散化,然后源向1连流量k,费用0,i与i+1流量无穷,一个区间的两个端点连流量1费用-w,n向t流量k,可以感受一下其正确性,证明?思考,
代码,有时间会打的

你可能感兴趣的:(未完)