最大密度子图


一、概念

对于一个图 G < V , E > G<V,E> G<V,E>,选出其一个子图 G ′ < V ′ , E ′ > G^{'}<V^{'},E^{'}> G<V,E>。要求如果选择了一条边,那么该边的端点也要被选,同时要使得 ∣ E ′ ∣ ∣ V ′ ∣ \frac {|E^{'}|}{|V^{'}|} VE最大。该图就是最大密度子图。


二、求法

1、问题转化

要求 ∣ E ′ ∣ ∣ V ′ ∣ \frac {|E^{'}|}{|V^{'}|} VE的最大值,可以联想到 01 01 01分数规划问题,采用二分答案的思路。
(像这种分母上一个东西,分子上一个东西,然后求它们的最值,一般都是 01 01 01分数规划问题)


2、求解过程

第一步:二分枚举答案 g g g,二分范围可以是 [ 1 n , m ] [\frac{1}{n},m] [n1,m]

第二步:验证答案。

设答案是 a n s ans ans

(1) 若 a n s > g ans>g ans>g,即 ∣ E ′ ∣ ∣ V ′ ∣ > g \frac {|E^{'}|}{|V^{'}|}>g VE>g ∣ E ′ ∣ − g ∣ V ′ ∣ > 0 |E^{'}|-g|V^{'}|>0 EgV>0,让 l = g l=g l=g
(2) 若 a n s < g ans<g ans<g,即 ∣ E ′ ∣ ∣ V ′ ∣ < g \frac {|E^{'}|}{|V^{'}|}<g VE<g ∣ E ′ ∣ − g ∣ V ′ ∣ < 0 |E^{'}|-g|V^{'}|<0 EgV<0,让 r = g r=g r=g

接下来的问题就是如何判定 ∣ E ′ ∣ − g ∣ V ′ ∣ |E^{'}|-g|V^{'}| EgV 0 0 0的关系,也就是如何求出 ∣ E ′ ∣ − g ∣ V ′ ∣ |E^{'}|-g|V^{'}| EgV的最大值。


求解方法有两种:

方法一

将该问题转化为最大权闭合子图问题。

具体转化方法是:
原图有一个限制:如果选择该边,那么该边的端点也要被选择,符合闭合图的限制)。

设有边 e e e a , b a,b a,b是其两个端点。
我们可以把边 e e e也看成一个点,记为 v e v_e ve


建图方法是:

从源点 s s s向所有边形成的点 v e v_e ve连一条容量是 1 1 1的边。
从所有这样的点 a a a向点 b b b连一条容量是 I N F INF INF的边。
从所有这样的点 a , b a,b a,b分别向 汇点 t t t连接一条容量是 g g g的边( g g g是二分的答案)。

然后求最大权闭合子图,求出来的最大权就是 ∣ E ′ ∣ − g ∣ V ′ ∣ |E^{'}|-g|V^{'}| EgV的最大值。

点数: ∣ V ∣ + ∣ E ∣ |V|+|E| V+E
边数: 3 ∣ E ∣ + ∣ V ∣ 3|E|+|V| 3E+V

由流网络的点数和边数可以看出这样的做法,其复杂度是比较高的。


方法二

m a x { ∣ E ′ ∣ − g ∣ V ′ ∣ } max\{|E^{'}|-g|V^{'}|\} max{EgV}等价于求 m i n { g ∣ V ′ ∣ − ∣ E ′ ∣ } min\{g|V^{'}|-|E^{'}|\} min{gVE}

有一个很显然性质:设选择的点集是 ∣ V ′ ∣ |V^{'}| V,那该点集内的所有的边都被选对于当前点集来说才是最优的。

这里就说一下另一个做法。


定义 V ′ ˉ = V − V ′ \bar{V^{'}}=V-V^{'} Vˉ=VV V V V是所有的点的集合。
定义 d v d_v dv表示点 v v v的度数。


g ∣ V ′ ∣ − ∣ E ′ ∣ = ∑ v ∈ V ′ g − ( ∑ v ∈ V ′ d v − C [ V ′ , V ′ ˉ ] 2 ) g|V^{'}|-|E^{'}|=\sum_{v \in V^{'}}g-(\frac{\sum_{v \in V^{'}}d_v-C[V^{'},\bar{V^{'}}]}{2}) gVE=vVg(2vVdvC[V,Vˉ])

后面括号里就是求点集 V ′ V^{'} V内包含的边数。

解释一下:
设集合内部所有点的度数之和是 s u m sum sum,那么,处于集合内部的边一定被计算了 2 2 2次,因为该边的两个端点均在集合内。而处于集合 V ′ V^{'} V与集合 V ′ ˉ \bar{V^{'}} Vˉ之间的割边只被计算了一次,而这样的割边的数量就是该割的容量 C [ V ′ , V ′ ˉ ] C[V^{'},\bar{V^{'}}] C[V,Vˉ],因为原图的所有边的容量在流网络中都设置成了 1 1 1
于是有集合内部(去掉割边)的边数 = s u m − C [ V ′ , V ′ ˉ ] 2 =\frac{sum-C[V^{'},\bar{V^{'}}]}{2} =2sumC[V,Vˉ]

对上面的式子在变一下:
原式 = 1 2 ( ∑ v ∈ V ′ ( 2 g − d v ) + C [ V ′ , V ′ ˉ ] ) =\frac{1}{2} (\sum_{v \in V^{'}}(2g-d_v)+C[V^{'},\bar{V^{'}}]) =21(vV(2gdv)+C[V,Vˉ])

流网络的构建:(不是很懂)
从每一个点向汇点 t t t连接一条容量是 2 g − d v + U 2g-d_v+U 2gdv+U的边。
从源点 s s s向向每一个点连接一条容量是 U U U的边。
原图内部所有边的容量都是 1 1 1

(其中 U U U是一个偏移量,可以任意取只要保证 2 g − d v 2g-d_v 2gdv都是正数就行,加偏移量的原因也是因为容量不能是负数)

对于该流网络的一个割 [ S , T ] [S,T] [S,T],令选出的点集是 V ′ = S − s V^{'}=S-s V=Ss V ′ ˉ = V − V ′ \bar{V^{'}}=V-V^{'} Vˉ=VV

割的容量 C [ S , T ] C[S,T] C[S,T]的表达式:

该割的割边有 3 3 3种情况:
s → V ′ ˉ s \to \bar{V^{'}} sVˉ
V ′ → t V^{'} \to t Vt
V ′ → V ′ ˉ V^{'} \to \bar{V^{'}} VVˉ

c ( u , v ) c_{(u,v)} c(u,v)表示 u u u v v v之间是否有边,有为 1 1 1,否则为 0 0 0

C [ S , T ] = ∑ v ∈ V ′ ˉ U + ∑ u ∈ V ′ ( 2 g − d u + U ) + ∑ u ∈ V ′ ∑ v ∈ V ′ ˉ c ( u , v ) C[S,T]=\sum_{v \in \bar{V^{'}}}U+\sum_{u\in V^{'}}(2g-d_u+U)+\sum_{u \in V^{'}}\sum_{v \in \bar{V^{'}}}c_{(u,v)} C[S,T]=vVˉU+uV(2gdu+U)+uVvVˉc(u,v)

化简式子:
C [ S , T ] C[S,T] C[S,T]

= ∑ v ∈ V ′ ˉ U + ∑ u ∈ V ′ ( U + 2 g − d u + ∑ v ∈ V ′ ˉ c ( u , v ) ) =\sum_{v \in \bar{V^{'}}}U+\sum_{u \in V^{'}}(U+2g-d_u+\sum_{v \in \bar{V^{'}}}c_{(u,v)}) =vVˉU+uV(U+2gdu+vVˉc(u,v))

接 下 来 的 一 步 化 简 是 从 其 意 义 得 出 的 : _{接下来的一步化简是从其意义得出的:} :
d u 表 示 从 集 合 V ′ 内 一 点 u 出 去 的 所 有 的 边 数 _{d_u表示从集合V^{'}内一点u出去的所有的边数} duVu
而 ∑ v ∈ V ′ ˉ c ( u , v ) 是 该 点 u 出 发 到 达 集 合 V ′ 外 部 V ′ ˉ 的 边 数 _{而\sum_{v \in \bar{V^{'}}}c_{(u,v)}是该点u出发到达集合V^{'}外部\bar{V^{'}}的边数} vVˉc(u,v)uVVˉ
它 们 两 个 相 减 就 是 从 u 出 发 到 达 集 合 内 部 的 边 数 = ∑ v ∈ V ′ c ( u , v ) _{它们两个相减就是从u出发到达集合内部的边数=\sum_{v \in V^{'}}c_{(u,v)}} u=vVc(u,v)

= ∑ v ∈ V ′ ˉ U + ∑ u ∈ V ′ ( U + 2 g − ∑ v ∈ V ′ c ( u , v ) ) =\sum_{v \in \bar{V^{'}}}U+\sum_{u \in V^{'}}(U+2g-\sum_{v \in V^{'}}c_{(u, v)}) =vVˉU+uV(U+2gvVc(u,v))

= ∑ v ∈ V ′ U + ∑ v ∈ V ′ ˉ U + ∑ u ∈ V ′ 2 g − ∑ u ∈ V ′ ∑ v ∈ V ′ c ( u , v ) =\sum_{v \in V^{'}}U+\sum_{v \in \bar{V^{'}}}U+\sum_{u \in V^{'}}2g-\sum_{u \in V^{'}}\sum_{v \in V^{'}}c_{(u,v)} =vVU+vVˉU+uV2guVvVc(u,v)

= n U + 2 g ∣ V ′ ∣ − 2 ∣ E ′ ∣ =nU+2g|V^{'}|-2|E^{'}| =nU+2gV2E

最终有:
C [ S , T ] = n U + 2 ( g ∣ V ′ ∣ − ∣ E ′ ∣ ) C[S,T]=nU+2(g|V^{'}|-|E^{'}|) C[S,T]=nU+2(gVE)

可以发现, n U nU nU是定值,所以 U U U的取值对答案是无影响的。
m i n { g ∣ V ′ ∣ − ∣ E ′ ∣ } min\{g|V^{'}|-|E^{'}|\} min{gVE}就是求 C [ S , T ] C[S,T] C[S,T]的最小值,也就是最小割。

点数: ∣ V ∣ |V^| V
边数: 2 ∣ V ∣ + ∣ E ∣ 2|V^|+|E| 2V+E

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值