本文参考UCAS卜东波老师算法设计与分析课程撰写
前言
在前文:算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)中,我们初步地了解了贪心算法与动态规划的区别,贪心解决了一个问题的简化版本,不必再大张旗鼓地使用动态规划。本文接着借由最短路径问题来讲述贪心算法的应用。
最短路径问题
问题描述与分析
-
给定一个图 G = ⟨ V , E ⟩ G=\lang V,E\rang G=⟨V,E⟩,对于图中每条边 e = ⟨ i , j ⟩ e=\lang i,j\rang e=⟨i,j⟩都有一个距离 d i , j d_{i,j} di,j。一个起始点s与一个终点t,问从s到t的最短路径是多少?
首先寻路问题显然是一个多步决策问题,先考虑用动态规划的方式解决,如果我们直接用 O P T ( i , j ) OPT(i,j) OPT(i,j)表示点i到点j的最短路径,这个要求太过严苛,因为转移方程无法与明确的 d ( u , v ) d(u,v) d(u,v)做关联。因此我们引入一个新的变量k,使得 O P T ( i , j ) OPT(i,j) OPT(i,j)变成 O P T ( i , j , k ) OPT(i,j,k) OPT(i,j,k)(从i到j经过最多k条边的最短路径),又由于起始点固定,我们只用考虑到达点即可,最终定义 O P T ( v , k ) OPT(v,k) OPT(v,k):从s到点v最多经过k条边的最短路径。由此我们可以得到状态转移方程如下:
O P T ( v , k ) = min { O P T ( v , k − 1 ) min ⟨ u , v ⟩ ∈ E { O P T ( u , k − 1 ) + d u , v } OPT(v,k) = \min \begin {cases} OPT(v,k-1) \\ \min_{\lang u,v\rang \in E}\{OPT(u,k-1)+d_{u,v}\} \end{cases} OPT(v,k)=min{ OPT(v,k−1)min⟨u,v⟩∈E{ OPT(u,k−1)+du,v}</