一、概念
对于一个图 G < V , E > G<V,E> G<V,E>,选出其一个子图 G ′ < V ′ , E ′ > G^{'}<V^{'},E^{'}> G′<V′,E′>。要求如果选择了一条边,那么该边的端点也要被选,同时要使得 ∣ E ′ ∣ ∣ V ′ ∣ \frac {|E^{'}|}{|V^{'}|} ∣V′∣∣E′∣最大。该图就是最大密度子图。
二、求法
1、问题转化
要求
∣
E
′
∣
∣
V
′
∣
\frac {|E^{'}|}{|V^{'}|}
∣V′∣∣E′∣的最大值,可以联想到
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
∣V′∣∣E′∣>g,
∣
E
′
∣
−
g
∣
V
′
∣
>
0
|E^{'}|-g|V^{'}|>0
∣E′∣−g∣V′∣>0,让
l
=
g
l=g
l=g。
(2) 若
a
n
s
<
g
ans<g
ans<g,即
∣
E
′
∣
∣
V
′
∣
<
g
\frac {|E^{'}|}{|V^{'}|}<g
∣V′∣∣E′∣<g,
∣
E
′
∣
−
g
∣
V
′
∣
<
0
|E^{'}|-g|V^{'}|<0
∣E′∣−g∣V′∣<0,让
r
=
g
r=g
r=g。
接下来的问题就是如何判定 ∣ E ′ ∣ − g ∣ V ′ ∣ |E^{'}|-g|V^{'}| ∣E′∣−g∣V′∣与 0 0 0的关系,也就是如何求出 ∣ E ′ ∣ − g ∣ V ′ ∣ |E^{'}|-g|V^{'}| ∣E′∣−g∣V′∣的最大值。
求解方法有两种:
方法一:
将该问题转化为最大权闭合子图问题。
具体转化方法是:
原图有一个限制:如果选择该边,那么该边的端点也要被选择,符合闭合图的限制)。
设有边
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^{'}| ∣E′∣−g∣V′∣的最大值。
点数:
∣
V
∣
+
∣
E
∣
|V|+|E|
∣V∣+∣E∣
边数:
3
∣
E
∣
+
∣
V
∣
3|E|+|V|
3∣E∣+∣V∣
由流网络的点数和边数可以看出这样的做法,其复杂度是比较高的。
方法二:
求 m a x { ∣ E ′ ∣ − g ∣ V ′ ∣ } max\{|E^{'}|-g|V^{'}|\} max{∣E′∣−g∣V′∣}等价于求 m i n { g ∣ V ′ ∣ − ∣ E ′ ∣ } min\{g|V^{'}|-|E^{'}|\} min{g∣V′∣−∣E′∣}。
有一个很显然性质:设选择的点集是 ∣ V ′ ∣ |V^{'}| ∣V′∣,那该点集内的所有的边都被选对于当前点集来说才是最优的。
这里就说一下另一个做法。
定义
V
′
ˉ
=
V
−
V
′
\bar{V^{'}}=V-V^{'}
V′ˉ=V−V′,
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})
g∣V′∣−∣E′∣=v∈V′∑g−(2∑v∈V′dv−C[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}
=2sum−C[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(∑v∈V′(2g−dv)+C[V′,V′ˉ])
流网络的构建:(不是很懂)
从每一个点向汇点
t
t
t连接一条容量是
2
g
−
d
v
+
U
2g-d_v+U
2g−dv+U的边。
从源点
s
s
s向向每一个点连接一条容量是
U
U
U的边。
原图内部所有边的容量都是
1
1
1。
(其中 U U U是一个偏移量,可以任意取只要保证 2 g − d v 2g-d_v 2g−dv都是正数就行,加偏移量的原因也是因为容量不能是负数)
对于该流网络的一个割 [ S , T ] [S,T] [S,T],令选出的点集是 V ′ = S − s V^{'}=S-s V′=S−s, V ′ ˉ = V − V ′ \bar{V^{'}}=V-V^{'} V′ˉ=V−V′。
割的容量 C [ S , T ] C[S,T] C[S,T]的表达式:
该割的割边有
3
3
3种情况:
①
s
→
V
′
ˉ
s \to \bar{V^{'}}
s→V′ˉ
②
V
′
→
t
V^{'} \to t
V′→t
③
V
′
→
V
′
ˉ
V^{'} \to \bar{V^{'}}
V′→V′ˉ
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]=v∈V′ˉ∑U+u∈V′∑(2g−du+U)+u∈V′∑v∈V′ˉ∑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)}) =∑v∈V′ˉU+∑u∈V′(U+2g−du+∑v∈V′ˉc(u,v))
接
下
来
的
一
步
化
简
是
从
其
意
义
得
出
的
:
_{接下来的一步化简是从其意义得出的:}
接下来的一步化简是从其意义得出的:
d
u
表
示
从
集
合
V
′
内
一
点
u
出
去
的
所
有
的
边
数
_{d_u表示从集合V^{'}内一点u出去的所有的边数}
du表示从集合V′内一点u出去的所有的边数
而
∑
v
∈
V
′
ˉ
c
(
u
,
v
)
是
该
点
u
出
发
到
达
集
合
V
′
外
部
V
′
ˉ
的
边
数
_{而\sum_{v \in \bar{V^{'}}}c_{(u,v)}是该点u出发到达集合V^{'}外部\bar{V^{'}}的边数}
而∑v∈V′ˉc(u,v)是该点u出发到达集合V′外部V′ˉ的边数
它
们
两
个
相
减
就
是
从
u
出
发
到
达
集
合
内
部
的
边
数
=
∑
v
∈
V
′
c
(
u
,
v
)
_{它们两个相减就是从u出发到达集合内部的边数=\sum_{v \in V^{'}}c_{(u,v)}}
它们两个相减就是从u出发到达集合内部的边数=∑v∈V′c(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)}) =∑v∈V′ˉU+∑u∈V′(U+2g−∑v∈V′c(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)} =∑v∈V′U+∑v∈V′ˉU+∑u∈V′2g−∑u∈V′∑v∈V′c(u,v)
= n U + 2 g ∣ V ′ ∣ − 2 ∣ E ′ ∣ =nU+2g|V^{'}|-2|E^{'}| =nU+2g∣V′∣−2∣E′∣
最终有:
C
[
S
,
T
]
=
n
U
+
2
(
g
∣
V
′
∣
−
∣
E
′
∣
)
C[S,T]=nU+2(g|V^{'}|-|E^{'}|)
C[S,T]=nU+2(g∣V′∣−∣E′∣)
可以发现,
n
U
nU
nU是定值,所以
U
U
U的取值对答案是无影响的。
求
m
i
n
{
g
∣
V
′
∣
−
∣
E
′
∣
}
min\{g|V^{'}|-|E^{'}|\}
min{g∣V′∣−∣E′∣}就是求
C
[
S
,
T
]
C[S,T]
C[S,T]的最小值,也就是最小割。
点数:
∣
V
∣
|V^|
∣V∣
边数:
2
∣
V
∣
+
∣
E
∣
2|V^|+|E|
2∣V∣+∣E∣