INF421 - Amphi 6: Graph
1. Shortest Path Problem
1.0 基本概念
输入:
一个Graph
G
=
(
V
,
E
)
G=(V,E)
G=(V,E),其权重记为
w
(
e
)
w(e)
w(e),
e
∈
E
e \in E
e∈E
Undirected Graph: 边用一个两点的集合表示,如
{
A
,
E
}
\{A,E\}
{A,E}
Directed Graph:边用一对两点表示,如
(
E
,
A
)
(E,A)
(E,A)
度的定义:
- 对于Undirected Graph
- N ( v ) : = { u ∈ V ∣ { u , v } ∈ E } N(v):=\{u\in V| \{u,v\}\in E\} N(v):={u∈V∣{u,v}∈E}
- 对于Directed Graph
- N − ( v ) : = { u ∈ V ∣ ( u , v ) ∈ E } N^-(v):=\{u\in V|(u,v)\in E\} N−(v):={u∈V∣(u,v)∈E},到达v的边的集合
- N + ( v ) : = { u ∈ V ∣ ( u , v ) ∈ E } N^+(v):=\{u\in V|(u,v)\in E\} N+(v):={u∈V∣(u,v)∈E},从v出发的
Path: v 0 , v 1 , … , v k v_0,v_1,\dots,v_k v0,v1,…,vk,其中 ∀ i ∈ [ 1 , … , k ] \forall i \in [1,\dots,k] ∀i∈[1,…,k] v i − 1 v_{i-1} vi−1到 v i v_{i} vi之间有边
- Simple path:所有经过的节点都不同
- length of P:所有经过的边之和
- distance: d ( u , v ) d(u,v) d(u,v) 从u到v的最短路径。
在下面的讨论中,我们采用如下的记号
N − ( v ) N^-(v) N−(v) 表示 N ( v ) N(v) N(v), N − ( v ) N^-(v) N−(v)
N + ( v ) N^+(v) N+(v) 表示 N ( v ) N(v) N(v), N + ( v ) N^+(v) N+(v)
( u , v ) ∈ E (u,v)\in E (u,v)∈E 在无向图中表示 { u , v } ∈ E \{u,v\} \in E {u,v}∈E
w ( u , v ) = w ( ( u , v ) ) = w ( { u , v } ) w(u,v) = w({(u,v)})=w(\{u,v\}) w(u,v)=w((u,v))=w({u,v})
图的表示:
- Adjacency Matrix: a i , j = w ( i , j ) a_{i,j}=w(i,j) ai,j=w(i,j) 如果没路的画是 ∞ \infty ∞
- Adjecency List L u L_u Lu: LinkedList L u L_u Lu(从u出发) of ( v , w ( u , v ) ) , v ∈ N + ( u ) (v,w(u,v)),v\in N^+(u) (v,w(u,v)),v∈N+(u),可以用一个类型Pair表示 ( v , w ( u , v ) ) (v,w(u,v)) (v,w(u,v))
1.1 Shortest Paths Problems:
三种常见的问法
- 计算A到B的最短路径 (一般都转化为2) SSSP (Single-source shortest path)
- 计算从A到各点的最短路径
- 计算任意两点的最短路径
SSSP: Single-Source shortest path
- 给定一个起点source s s s,计算它到任何点的最短距离
ASPS: All-Pair Shortest Paths
计算任意两点的最短路径
1.2 🌟 Exchange Property
Exchange Property:
下面我们想证明:
如果P是 v 0 v_0 v0到 v k v_k vk的最短路径,则它所有子路径 v i v_i vi到 v j v_j vj也是最短路径。
(反证):如果存在一个
P
P
P的子路径
v
i
v
j
v_i v_j
vivj不是最短路径,即存在
P
′
P'
P′它的长度小于
v
i
v
j
v_i v_j
vivj,则Path
P
~
:
v
0
,
P
′
,
v
k
\tilde{P}: v_0,P',v_k
P~:v0,P′,vk的长度一定比
P
P
P的长度要小,与
P
P
P是最短路径矛盾。
换言之,我们可以得到一个推论:
d ( s , v ) = m i n { d ( s , u ) + w ( u , v ) ∣ u ∈ N − ( v ) } d(s,v)=min\{d(s,u)+w(u,v) | u \in N^-(v)\} d(s,v)=min{d(s,u)+w(u,v)∣u∈N−(v)}
原因很简单,因为我们知道2点:
- 一条到达v的path倒数第二个点一定在 N − ( v ) N^-(v) N−(v),即要和 v v v联通。
- 由上一条性质知道,这条从s到v的最短路径的任意子路径如s到u一定是最短路径,所以我们考虑 d ( s , u ) d(s,u) d(s,u)
或者还有一种说法,即到达v的路径一共由 c a r d ( N − ( v ) ) card(N^-(v)) card(N−(v))条,每条路为了最短一定由一条从 s s s到 u i u_i ui的最短路径 d ( s , u i ) d(s,u_i) d(s,ui)和一条边 ( u i , v ) (u_i,v) (ui,v)得到,然后再取 m i n u ∈ N − ( v ) min_{u\in N^-(v)} minu∈N−(v)即可
但问题是我们不知道该用什么顺序来解决subproblems,甚至subproblems之间会有依赖。
2. Dijkastra Algorithm
2.0 问题描述: Connected Graph, Non-Negative Edge Weights SSSP
我们考虑一个SSSP(Single-Source Shortest Path)
- Connected
- Directed / Undirected
- Non-negative edge weights
- source s ∈ V s \in V s∈V
2.1 Key Lemma:
令 U ∈ V U \in V U∈V, V V V是所有顶点的集合,source s ∈ U s \in U s∈U
∀ v ∈ V ∖ U \forall v \in V\setminus U ∀v∈V∖U,令 tentative distance d U ( s , v ) = m i n { d ( s , u ) + w ( u , v ) ∣ u ∈ U ∩ N − ( v ) } d_U(s,v)=min\{d(s,u)+w(u,v) | u \in U \cap N^-(v)\} dU(s,v)=min{d(s,u)+w(u,v)∣u∈U∩N−(v)}
如果上面的交集为 ϕ \phi ϕ,即单凭U中的元素不能到达v,则我们令 d U ( s , v ) = ∞ d_U(s,v)=\infty dU(s,v)=∞
d ( s , v ) = m i n v ∈ V ∖ U d U ( s , v ) d(s,v) =min_{v\in V\setminus U} d_U(s,v) d(s,v)=minv∈V∖UdU(s,v)
Dijkstra’s algorithm to compute all d ( s , v ) d(s,v) d(s,v)
- Start: U:={s},d(s,s):=0
- While
U
≠
V
U\neq V
U=V
- Find a v ∈ V ∖ U v \in V\setminus U v∈V∖U with minimal d U ( s , v ) d_U(s,v) dU(s,v)
- U : = U ∪ { v } U:=U\cup \{v\} U:=U∪{v}, d ( s , v ) : = d U ( s , v ) d(s,v):=d_U(s,v) d(s,v):=dU(s,v)
Key Lemma 的简单证明:
❓是不是需要证明
∀
u
∈
U
\forall u\in U
∀u∈U,
s
s
s到
u
u
u的距离一定是最小的?
我们根据定义可知:
d
(
s
,
v
)
=
m
i
n
v
∈
V
∖
U
d
U
(
s
,
v
)
=
m
i
n
v
∈
V
∖
U
m
i
n
u
∈
U
∩
N
−
(
v
)
d
(
s
,
u
)
+
w
(
u
,
v
)
d(s,v)=min_{v\in V\setminus U} d_{U}(s,v)=min_{v\in V\setminus U}min_{u \in U\cap N^-(v)} d(s,u)+w(u,v)
d(s,v)=minv∈V∖UdU(s,v)=minv∈V∖Uminu∈U∩N−(v)d(s,u)+w(u,v)
Dem:
我们假设
v
∈
V
∖
U
v\in V\setminus U
v∈V∖U是使得上式中取到最小值的
v
v
v。此时我们实际上要证明的一件事就是,为什么
d
(
s
,
v
)
=
m
i
n
u
∈
U
∩
N
−
(
v
)
d
(
s
,
u
)
+
w
(
u
,
v
)
d(s,v)=min_{u \in U\cap N^-(v)} d(s,u)+w(u,v)
d(s,v)=minu∈U∩N−(v)d(s,u)+w(u,v)
换言之,为什么最小值不可能是
s
s
s经过一个
v
i
∈
N
−
(
v
)
∖
U
v_i \in N^-(v)\setminus U
vi∈N−(v)∖U得到的?(因为为了到达
v
v
v,我们倒数第二个点一定在
N
−
(
v
)
N^-(v)
N−(v)里面)
假设存在这样一个
v
i
∈
N
−
(
v
)
∖
U
v_i \in N^-(v)\setminus U
vi∈N−(v)∖U,下证明s-u-v这条路长度小于s-
v
i
v_i
vi-v。
因为我们定义
v
v
v是所有
v
∈
V
∖
U
v\in V\setminus U
v∈V∖U中到
U
U
U距离最小的点,所以
d
(
s
,
v
i
)
=
d
U
(
s
,
v
i
)
≥
d
U
(
s
,
v
)
d(s,v_i)=d_U(s,v_i)\geq d_U(s,v)
d(s,vi)=dU(s,vi)≥dU(s,v)
另一方面,由问题假设中每条边的长度
≥
0
\geq 0
≥0且
v
i
∈
N
−
(
v
)
v_i \in N^-(v)
vi∈N−(v)(
v
i
v_i
vi和
v
v
v联通,
w
(
v
i
,
v
)
w(v_i,v)
w(vi,v)存在),
w
(
v
i
,
v
)
≥
0
w(v_i,v)\geq0
w(vi,v)≥0
因此
∀
v
i
∈
N
−
(
v
)
∖
U
,
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
≥
d
U
(
s
,
v
)
\forall v_i \in N^-(v)\setminus U, d(s,v_i)+w(v_i,v) \geq d_U(s,v)
∀vi∈N−(v)∖U,d(s,vi)+w(vi,v)≥dU(s,v)
又因为
d
(
s
,
v
)
=
m
i
n
v
i
∈
N
−
(
v
)
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
=
m
i
n
(
m
i
n
v
i
∈
U
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
,
m
i
n
v
i
∈
N
−
(
v
)
∖
U
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
)
=
m
i
n
(
d
U
(
s
,
v
)
,
m
i
n
v
i
∈
N
−
(
v
)
∖
U
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
)
=
d
U
(
s
,
v
)
\begin{aligned} d(s,v) &=min_{v_i \in N^-(v)}d(s,v_i)+w(v_i,v) \\ &= min(min_{v_i \in U}d(s,v_i)+w(v_i,v),min_{v_i \in N^-(v)\setminus U}d(s,v_i)+w(v_i,v)) \\ &= min(d_U(s,v),min_{v_i \in N^-(v)\setminus U}d(s,v_i)+w(v_i,v)) \\ & = d_U(s,v) \end{aligned}
d(s,v)=minvi∈N−(v)d(s,vi)+w(vi,v)=min(minvi∈Ud(s,vi)+w(vi,v),minvi∈N−(v)∖Ud(s,vi)+w(vi,v))=min(dU(s,v),minvi∈N−(v)∖Ud(s,vi)+w(vi,v))=dU(s,v)
其中最后一个等号用到了
d
(
s
,
v
i
)
=
d
U
(
s
,
v
i
)
≥
d
U
(
s
,
v
)
d(s,v_i)=d_U(s,v_i)\geq d_U(s,v)
d(s,vi)=dU(s,vi)≥dU(s,v)和
w
(
v
i
,
v
)
)
≥
0
w(v_i,v))\geq 0
w(vi,v))≥0
又因为我们每次添加到s中的点
v
v
v对应的距离
d
(
s
,
v
)
d(s,v)
d(s,v)一定是最小的,所以这个loop invariant成立,即
∀
u
∈
U
\forall u\in U
∀u∈U,
s
s
s到
u
u
u的距离一定是最小的。
2.2 Dijkstra Algorithm 伪代码
Version 1(只记录了距离)
- U :={s}
- d[s] := 0 % d[v]用于记录s到v的最短距离
- while
U
≠
V
U\neq V
U=V do
- d ( s , v ) = m i n v ∈ V ∖ U d U ( s , v ) = m i n v ∈ V ∖ U m i n u ∈ U ∩ N − ( v ) d ( s , u ) + w ( u , v ) d(s,v)=min_{v\in V\setminus U} d_{U}(s,v)=min_{v\in V\setminus U}min_{u \in U\cap N^-(v)} d(s,u)+w(u,v) d(s,v)=minv∈V∖UdU(s,v)=minv∈V∖Uminu∈U∩N−(v)d(s,u)+w(u,v)
- 即找 v ∈ V ∖ U v \in V \setminus U v∈V∖U和 u ∈ U ∩ N − ( v ) u \in U\cap N^-(v) u∈U∩N−(v)使得d[u]+w(u,v)最小。
- U : = U ∪ { v } U:=U\cup \{v\} U:=U∪{v}
- d[v]:=d[u]+w(u,v)
- output d[V]
Version 2(记录了距离和Path)
- U :={s},p[s]:=s %p[s] 记录了是谁走到s的
- d[s] := 0 % d[v]用于记录s到v的最短距离
- while
U
≠
V
U\neq V
U=V do
- d ( s , v ) = m i n v ∈ V ∖ U d U ( s , v ) = m i n v ∈ V ∖ U m i n u ∈ U ∩ N − ( v ) d ( s , u ) + w ( u , v ) d(s,v)=min_{v\in V\setminus U} d_{U}(s,v)=min_{v\in V\setminus U}min_{u \in U\cap N^-(v)} d(s,u)+w(u,v) d(s,v)=minv∈V∖UdU(s,v)=minv∈V∖Uminu∈U∩N−(v)d(s,u)+w(u,v)
- 即找 v ∈ V ∖ U v \in V \setminus U v∈V∖U和 u ∈ U ∩ N − ( v ) u \in U\cap N^-(v) u∈U∩N−(v)使得d[u]+w(u,v)最小。
- U : = U ∪ { v } , p [ v ] : = u U:=U\cup \{v\},p[v]:=u U:=U∪{v},p[v]:=u
- d[v]:=d[u]+w(u,v)
- output d[V]
路径还原
while(p[s]!=s){
print(p[s])
s = p[s]
}
2.3 如何实现?
这里我们讨论
v
,
u
v,u
v,u的寻找:
d
(
s
,
v
)
=
m
i
n
v
∈
V
∖
U
d
U
(
s
,
v
)
=
m
i
n
v
∈
V
∖
U
m
i
n
u
∈
U
∩
N
−
(
v
)
d
(
s
,
u
)
+
w
(
u
,
v
)
d(s,v)=min_{v\in V\setminus U} d_{U}(s,v)=min_{v\in V\setminus U}min_{u \in U\cap N^-(v)} d(s,u)+w(u,v)
d(s,v)=minv∈V∖UdU(s,v)=minv∈V∖Uminu∈U∩N−(v)d(s,u)+w(u,v)
简单的for循环:O(mn)
❓
m:边数,O(m)是因为我们要遍历所有到达z的边
n:顶点数量,因为每一次我们都要查找
n
−
1
+
n
−
2
+
.
.
.
+
1
∼
n
2
n-1+n-2+...+1 \sim n^2
n−1+n−2+...+1∼n2
用Priority Queue实现
因为V的个数一共为n,一开始有一个s,所以需要n-1次添加和extractmin。
- 为什么需要2m次decreasekeys?
因为我们每添加一个顶点,我们都要看新增顶点相邻的顶点 v ∈ V c v \in V^c v∈Vc,更新 d U ( v ) d_U(v) dU(v),所以 ∑ v ∈ V d e g ( v ) = 2 ∗ ∣ E ∣ \sum_{v\in V} deg(v)=2*|E| ∑v∈Vdeg(v)=2∗∣E∣
2.4 总结
主要思想:
- 将所有的最短距离存在一个树中
- 对 ( v , d U ( s , v ) ) (v,d_U(s,v)) (v,dU(s,v))使用priority queue
Rq:
Dijkastra和Prim算法很像,因为:
- Prim算法是找v到已经生成的树的距离 d ( s , v ) , s ∈ Tree d(s,v), s \in \text{Tree} d(s,v),s∈Tree最小
- Dijkstra算法是找v使得 d U ( s , v ) d_U(s,v) dU(s,v)最小
Runtime:跟Prim一样
- n是顶点数,m是边数
- O(mlogn) simple priority queue or an edge-based queue
- O(m+nlogn) with a priority queue doing decreasekey in constant time and rest in logarithmic time
3. SSSP with Negative Edge Weights
3.0 Negative Cycles
为什么Dijkstra不能有Negative weights
因为我们在证明的使用用到了
d ( s , v i ) = d U ( s , v i ) ≥ d U ( s , v ) d(s,v_i)=d_U(s,v_i)\geq d_U(s,v) d(s,vi)=dU(s,vi)≥dU(s,v)
另一方面,由问题假设中每条边的长度
≥
0
\geq 0
≥0且
v
i
∈
N
−
(
v
)
v_i \in N^-(v)
vi∈N−(v)(
v
i
v_i
vi和
v
v
v联通,
w
(
v
i
,
v
)
w(v_i,v)
w(vi,v)存在),
w
(
v
i
,
v
)
≥
0
w(v_i,v)\geq0
w(vi,v)≥0 因此
∀
v
i
∈
N
−
(
v
)
∖
U
,
d
(
s
,
v
i
)
+
w
(
v
i
,
v
)
≥
d
U
(
s
,
v
)
\forall v_i \in N^-(v)\setminus U, d(s,v_i)+w(v_i,v) \geq d_U(s,v)
∀vi∈N−(v)∖U,d(s,vi)+w(vi,v)≥dU(s,v)
3.1 Dynamic Programming
🌟Solution: 我们可以给问题增加一个维度
另一方面,我们通过对上面Negative Cycle的观察,我们发现,问题出在我们如果绕那个Cycle转若干圈,我们就会得到一个无限小的值。因此,我们引入如下定义希望能限制路程的长度:
d i ( s , v ) = 从s到v的最短路径,最多经过i个边 d_i(s,v) = \text{从s到v的最短路径,最多经过i个边} di(s,v)=从s到v的最短路径,最多经过i个边
我们观察到,
d
i
(
s
,
v
)
=
m
i
n
{
d
i
−
1
(
s
,
v
)
,
d
i
−
1
(
s
,
u
)
+
w
(
u
,
v
)
∣
u
∈
N
−
(
v
)
}
d_i(s,v)=min\{d_{i-1}(s,v),d_{i-1}(s,u)+w(u,v) | u \in N^-(v) \}
di(s,v)=min{di−1(s,v),di−1(s,u)+w(u,v)∣u∈N−(v)}
这是因为,我们可以可以分成2类情况
❓为什么第二类不包含第一类?
- Cas 1: d i ( s , v ) d_i(s,v) di(s,v)只用了小于i条边(小于等于i-1)达到: d i − 1 ( s , v ) d_{i-1}(s,v) di−1(s,v)
- Cas 2: d i ( s , v ) d_i(s,v) di(s,v)用了i条边达到 ⊂ { d i − 1 ( s , u ) + w ( u , v ) ∣ u ∈ N − ( v ) } \subset \{d_{i-1}(s,u)+w(u,v) | u \in N^-(v) \} ⊂{di−1(s,u)+w(u,v)∣u∈N−(v)},因为后者包括了所有s到v的小于等于i条边的路径。
m来自
N
−
(
v
)
N^-(v)
N−(v)
3.2 Bellman-Ford Algorithm
Runtime:O(mn)
4. APSP Problem
目的:给出任意两点间的最短路径
一些简单的想法:对每个顶点,用n次
- Dijkstra: n*O(m+nlogn) [no negative edge]
- Bellman-Ford: n ∗ O ( n m ) n*O(nm) n∗O(nm) [with negative edge]
4.1 Floyd-Warshall
对于完全图(complete edge),因为非完全图可以通过添加一条权重很大的边变成完全图。
引入
d
k
(
i
,
j
)
d_k(i,j)
dk(i,j)为从i出发到j,只经过
[
1
,
.
.
.
,
k
]
[1,...,k]
[1,...,k]的最短路径。
运行时间:O(n^3)
空间:O(n^2)
伪代码
n = 节点的数量
dp = 用来存储记录两点之间最短距离的邻接矩阵
next = 用来帮助重构最短路径的矩阵next[i][j]表示要找从i到j的最短路径,下一步应该去节点next[i][j];
m = 用来表示图的邻接矩阵
function floydWarshall(m){
//第一步:用m初始化 dp和next
dp = n*n的空2维数组
next = n*n的空2维数组
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
dp[i][j]=m[i][j];
if m[i][j]!= 10^7: //即若i通向j
next[i][j]=j;
}
//第二步:Floyd
for(int k=0;k<n;k++)
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
if(dp[i][k]+dp[k][j]<dp[i][j]){
dp[i][j]=dp[i][k]+dp[k][j];
next[i][j]=next[i][k]; //因为我们是从i->k->j,所以下一步和从i到k的最小值路径的第一步相同
}
// 第三步:(可选)检测Negative Cycle
propagateNegativeCycles(dp,n);
return dp;
}
检测Negative Cycle伪代码
function propagateNegativeCycles(dp,n){
for(int k=0;k<n;k++)
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
if(dp[i][k]+dp[k][j]<dp[i][j]){
dp[i][j]= -infty //表明i到j的最短路径属于或者经过一个Negative Cycle
next[i][j]=-1; //标记这条边
}
}
重新构建路径
function reconstructPath(start,end){
path[]
// 检测这两点是联通的
if dp[start][end] == +infty:
return path
tmp = start; //从start开始还原路径
for(;tmp!=end;tmp=next[tmp][end]){
if tmp==-1:
return -1 //说明最短路径属于或者经过一个Negative Cycle
path.add(tmp) //注意这里加的是起点,而非next[start][end]
}
//因为有可能一个元素(如end)自己陷入Negative Cycle
if next[tmp][end]==-1:
return null
path.add(end)
return path;
}
5. Shortest Paths Today
我们可以通过Preprocessing的方法加快用户查询两点之间最短路径的时间。
5.0 Transit Node Routing
直觉:
例如从城市A到城市B的最短路径一般都会进过高速公路,所以计算城市A某地到城市B某地的最短路径的问题可以转化为从城市A某地到城市A高速路口,
从城市A高速路口到城市B高速路口,(两个Transit Node)
从城市B高速路口到城市B某地。
我们可以预先计算任何2个Transit Node之间的距离,和任意节点到Transit Node的距离。
6. Eulerian and Hamiltonian Cycles
6.1 Eulerian Cycle (一笔画)
一个每一条边只经过1次的Cycle
一个拥有Eulerian Cycle的图成为Eulerian Graph
Thm d’Euler
一个Connected Graph当且仅当它每一个顶点的度数为偶数的时候才有Eulerian Cycle
Thm Hierholzer:
在一个Eulerian Graph中,一个Eulerian Cycle可以通过O(m)的时间检测出来
6.2 Hamiltonian Cycle
一个每个顶点只经过1次的Cycle(回路)
Thm:
确定一个图是否有Hamilton回路是一个NP-complete的问题。
7. Traveling Salesman Problem
7.0 Symmetrix Traveling Salesman Problem
问题描述:
给定n座城市,和他们两两之间的距离(n*n的非负矩阵)
目的:
找一个经过所有城市的Cycle使其总距离最少。
等价描述:
找一个总距离和最少的Hamiltonian Cycle。
7.1 Metric TSP
考虑这么一种情形:人在B城,
若d(A,C)>2*d(A,B)+d(B,C)>d(A,B)+d(B,C),则要走完的画,他一定选择B->A->B->C。
为此,我们假设
d
(
i
,
k
)
≤
d
(
i
,
j
)
+
d
(
j
,
k
)
d(i,k)\leq d(i,j)+d(j,k)
d(i,k)≤d(i,j)+d(j,k)
Metric TSP: 满足上面三角不等式的TSP问题
Lemma:
在一个Metric TSP中,可以走斜边这条捷径。
7.2 A simple 2-Approximation for Metric TSP
我们首先找到N个点的最小生成树(MST)
T
T
T,我们有
w
(
T
)
≤
w
O
P
T
w(T)\leq w_{OPT}
w(T)≤wOPT
因为我们可以将OPT切掉一条边就得到一个Tree,而根据MST定义, w ( T ) w(T) w(T)一定小于这个新生成的Tree。
然后,我们将 T T T中的每一条边翻倍得到 T ′ T' T′,因为此时每一个点的度数都为偶数,所以由欧拉定理,我们可以得到一个Eulerian Cycle C C C。由定义 w ( C ) = w ( T ′ ) = 2 ∗ w ( T ) w(C)=w(T')=2*w(T) w(C)=w(T′)=2∗w(T)。
最后,我们利用Metric TSP中的三角不等式跳过一
些节点得到Hamilton回路
H
H
H,因为斜边更短,所以
w
(
H
)
≤
w
(
C
)
w(H)\leq w(C)
w(H)≤w(C)
因此
w
(
H
)
≤
w
(
C
)
=
2
∗
w
(
T
)
≤
2
∗
w
O
P
T
w(H)\leq w(C)=2*w(T)\leq 2*w_{OPT}
w(H)≤w(C)=2∗w(T)≤2∗wOPT
7.3 1.5-Approximation Algorithm for Metric TSP ❓
minimum-weight perfect matching:
In a complete graph with an even number of vertices, one can compute in poly-time a minimum-weight perfect matching (a set of edges that contain all vertices, do not intersect, and have minimum weight).
Christofide
- 计算一个MST T T T
- 令 U U U为T中含有偶数Degree的集合
- 找到一个min-weight perfect matching in U
- compute an Eulerian cycle C of T ∪ M T\cup M T∪M M是这个PerfectMatching❓
- 用斜边将C变为Hamiltonien H
首先证明,我们所有操作都是合理的
- |U| 是偶数的(这样才能保证Perfect Matching 存在): ∑ v ∈ V d ( v ) = 2 m \sum_{v\in V}d(v)=2m ∑v∈Vd(v)=2m
- T ∪ M T\cup M T∪M是一个multi graph,其中每一个顶点都有偶数个dgree(因此存在Eulerian Cycle)the additional edges from increase the degree of the odd vertices of by one.
下面证明Approximation Ratio是1.5:
-
w ( T ) ≤ w O P T w(T)\leq w_{OPT} w(T)≤wOPT
-
令 H U ∗ H^*_U HU∗为U的TSP问题最小回路,因为U是偶数, H U ∗ H^*_U HU∗是两个perfect matching的Union。因此 2 ∗ w ( M ) ≤ w ( H U ∗ ) 2*w(M)\leq w(H_U^*) 2∗w(M)≤w(HU∗)
-
全局最优的解 H ∗ H^* H∗满足 w O P T = w ( H ∗ ) ≥ w ( H U ) ≥ w ( H U ∗ ) w_{OPT}=w(H^*)\geq w(H_U)\geq w(H^*_U) wOPT=w(H∗)≥w(HU)≥w(HU∗)(我们只需要把不属于U的节点用一条边截掉)
-
因此我们得到的H满足(因为由"裁剪"Eulerian Cycle C)得到
w ( H ) ≤ w ( C ) = w ( T ) + w ( M ) ≤ w o p t + 0.5 w o p t w(H)\leq w(C) = w(T)+w(M) \leq w_{opt}+0.5w_{opt} w(H)≤w(C)=w(T)+w(M)≤wopt+0.5wopt