INF421 - Amphi 6: Graph [最短路径:Dijkstra,Bellman-Ford,Floyd]

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 eE

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):={uV{u,v}E}
  • 对于Directed Graph
    • N − ( v ) : = { u ∈ V ∣ ( u , v ) ∈ E } N^-(v):=\{u\in V|(u,v)\in E\} N(v):={uV(u,v)E},到达v的边的集合
    • N + ( v ) : = { u ∈ V ∣ ( u , v ) ∈ E } N^+(v):=\{u\in V|(u,v)\in E\} N+(v):={uV(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} vi1 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)),vN+(u),可以用一个类型Pair表示 ( v , w ( u , v ) ) (v,w(u,v)) (v,w(u,v))

1.1 Shortest Paths Problems:

三种常见的问法

  1. 计算A到B的最短路径 (一般都转化为2) SSSP (Single-source shortest path)
  2. 计算从A到各点的最短路径
  3. 计算任意两点的最短路径

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)uN(v)}

原因很简单,因为我们知道2点:

  1. 一条到达v的path倒数第二个点一定在 N − ( v ) N^-(v) N(v),即要和 v v v联通。
  2. 由上一条性质知道,这条从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)} minuN(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 sV

2.1 Key Lemma:

U ∈ V U \in V UV V V V是所有顶点的集合,source s ∈ U s \in U sU
∀ v ∈ V ∖ U \forall v \in V\setminus U vVU,令 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)uUN(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)=minvVUdU(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 vVU 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 uU 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)=minvVUdU(s,v)=minvVUminuUN(v)d(s,u)+w(u,v)

Dem:
我们假设 v ∈ V ∖ U v\in V\setminus U vVU是使得上式中取到最小值的 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)=minuUN(v)d(s,u)+w(u,v)
换言之,为什么最小值不可能是 s s s经过一个 v i ∈ N − ( v ) ∖ U v_i \in N^-(v)\setminus U viN(v)U得到的?(因为为了到达 v v v,我们倒数第二个点一定在 N − ( v ) N^-(v) N(v)里面)
假设存在这样一个 v i ∈ N − ( v ) ∖ U v_i \in N^-(v)\setminus U viN(v)U,下证明s-u-v这条路长度小于s- v i v_i vi-v。
在这里插入图片描述
因为我们定义 v v v是所有 v ∈ V ∖ U v\in V\setminus U vVU中到 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) viN(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) viN(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)=minviN(v)d(s,vi)+w(vi,v)=min(minviUd(s,vi)+w(vi,v),minviN(v)Ud(s,vi)+w(vi,v))=min(dU(s,v),minviN(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 uU 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)=minvVUdU(s,v)=minvVUminuUN(v)d(s,u)+w(u,v)
    • 即找 v ∈ V ∖ U v \in V \setminus U vVU u ∈ U ∩ N − ( v ) u \in U\cap N^-(v) uUN(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)=minvVUdU(s,v)=minvVUminuUN(v)d(s,u)+w(u,v)
    • 即找 v ∈ V ∖ U v \in V \setminus U vVU u ∈ U ∩ N − ( v ) u \in U\cap N^-(v) uUN(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)=minvVUdU(s,v)=minvVUminuUN(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 n1+n2+...+1n2

用Priority Queue实现
在这里插入图片描述
因为V的个数一共为n,一开始有一个s,所以需要n-1次添加和extractmin。

  • 为什么需要2m次decreasekeys?
    因为我们每添加一个顶点,我们都要看新增顶点相邻的顶点 v ∈ V c v \in V^c vVc,更新 d U ( v ) d_U(v) dU(v),所以 ∑ v ∈ V d e g ( v ) = 2 ∗ ∣ E ∣ \sum_{v\in V} deg(v)=2*|E| vVdeg(v)=2E

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),sTree最小
  • 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) viN(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) viN(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)=sv的最短路径,最多经过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{di1(s,v),di1(s,u)+w(u,v)uN(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) di1(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) \} {di1(s,u)+w(u,v)uN(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) nO(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)=2w(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)=2w(T)2wOPT

在这里插入图片描述

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 TM M是这个PerfectMatching❓
  • 用斜边将C变为Hamiltonien H

首先证明,我们所有操作都是合理的

  • |U| 是偶数的(这样才能保证Perfect Matching 存在): ∑ v ∈ V d ( v ) = 2 m \sum_{v\in V}d(v)=2m vVd(v)=2m
  • T ∪ M T\cup M TM是一个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^*) 2w(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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值