最大密度子图
一、了解概念
首先要了解什么是最大密度子图,顾名思义,就是所有子图中密度最大的那一个。那么什么是一个子图的密度呢,这里规定子图的密度就是子图中边数和点数的比值。
二、怎么做
大体上是一个二分的01分数规划,但二分的判断函数要通过最小割模型来求,这里的求法是问题的关键,具体有如下两种求法。
1、方法一
我们选一个子图时,规定说选取原图的某条边时,那么这条边的两个顶点也一定要选,而选一个单独的点是可以选的。也就是说不能只选某条边而不选该边两个顶点,这不是一个子图的定义。在这个限制条件下,我们要尽可能的多选边,少选点,那么我们可以将边看作点,将点也看做点,从边变成的点向其两个端点做一条有向边,我们选这条边就必须要选这两个端点,这不就是闭合子图嘛,那么求最大密度子图的问题就变成了在新图中求最大权闭合子图的问题了(不懂的可以了解一下)
建图时我们将边变成的点的点权设为1,点变成的点的点权设为-g,这样最大权闭合子图求出来的答案就是我们要求的 N e − g × N v Ne - g \times Nv Ne−g×Nv的最大值了。
2、方法二
但方法一需要建的点和边太多了,不方便,所以我们可以利用已有的性质来找到一个更好的方法,即方法二。
我们已知图中点数是n,边数是m,我们从源点s向每一个点建一条容量为m的边,原图内部的边容量都建成1,再从每个点向汇点t建一条容量为2g-dv+m的边。我们求出该流网络中的最小割,然后我们要求的 N e − g × N v Ne - g \times Nv Ne−g×Nv的最大值就是 n × m − 最 小 割 2 \frac {n\times m-最小割}{2} 2n×m−最小割。
证明如下,可选择性的看,看不懂的话知道做法后可跳过。。。
三、证明
首先我们先写出密度的计算式: N e N v \frac {Ne}{Nv} NvNe,其中Ne是边的个数,Nv是点的个数。我们要求这个式子的最大值,见到分式和最大化,我们就想到了01分数规划。我们假设最大密度为g,那么就有 N e N v ≤ g \frac {Ne}{Nv} \le g NvNe≤g,通过化简得到 N e − g × N v ≤ 0 Ne - g \times Nv \le 0 Ne−g×Nv≤0,根据01分数规划,我们不断二分g,求 N e − g × N v Ne - g \times Nv Ne−g×Nv的最大值,使其最大值等于0,则这个g就是我们要求的答案了。
那么问题的关键就到了如何 计算 N e − g × N v Ne - g \times Nv Ne−g×Nv的最大值?我们通过变形,原式的最大值就等于 g × N v − N e g\times Nv - Ne g×Nv−Ne的最小值。所以我们要求的就是一个子图的点数和边数,对于确定的一个子图,其点数很好算,那么子图中的边数怎么算呢?我们可以将每一条边分成两半来看,一半给左端点,一半给右端点,那么子图中的边数就等于各点的度数之和 ÷ 2 \div2 ÷2 减去 该点集和点集外的边数 ÷ 2 \div2 ÷2 ,这里的点集内和点集外的边数就等于这里的割集。
我们用公式来表示就是 g × N v − N e = g × N v − ( ∑ v ∈ v 1 d v 2 − C