带权图上的三个问题--最短路问题、中国邮递员问题与货郎担问题

带权图上的三个问题

1.最短路问题
设带权图G(V, E, W),且每一条边的权都是非负实数。对任意u,v∈V,当u和v连通(u可达v)时,称从u到v长度最短的路径为u到v的最短路径,该路径的长度称作距离d(u, v)。约定d(u, u) = 0,当u不可达v时d(u, v) = ∞。

Dijkstra算法
输入:带权图G(V, E, W)和s∈V,其中|V| = n,对任意e∈E,W(e)≥0。
输出:s到G中每一个点的最短路径及距离
记每一个顶点的标号L(v) = (L1(v), L2(v))。标号分为永久标号和临时标号。对永久标号,L1(v)和L2(v)分别是:s到v的最短路径上v的前一个顶点;s到v的距离。对临时标号,L1(v)和L2(v)分别是:当前从s经过已永久标号的点到达v的最短路上v的前一个顶点;这条路径的长度。
【1】L(s) = (s, 0),L(v) = (s, +∞),v∈V – {s},i = 1。L(s)是永久标号,其余均为临时标号,u = s。
【2】对u邻接的临时标号的顶点v:
如果L2(u) + W(u, v) < L2(v),那么令L(v) = (u, L2(u) + W(u, v))。
【3】计算L2(t) = min{L2(v) | v∈V且有临时标号},把L(t)改为永久标号。
【4】如果i < n,那么令u = t,i = i + 1,返回到【2】继续。
计算完毕后,对每一个顶点u,都有d(s, u) = L2(u)。利用L1(v)从u开始回溯,查找从s到u的最短路径。

2.中国邮递员问题
邮递员从邮局出发,走遍负责街区投递邮件,最后回到邮局。问:如何走才能使他走的路最短?对应的图论模型是:给定一个带权无向图,所有边权均非负,求每一条边至少经过一次的最短回路。该问题由管梅谷于1962年首度提出,故称中国邮递员问题。

如果存在欧拉回路,那么任意一条欧拉回路都是正解,经过每一条欧拉回路走过的距离都是一样的,均为所有边的边权之和。
如果不存在欧拉回路,那么由于每一条边都会贡献两个度,图的总度数一定是偶数,所以奇度顶点的个数只能是偶数。那么,把奇度顶点每两个分一对,枚举全部组合,求出重复部分的最短距离,即令每一对奇度顶点中一个点到另一个点的最短距离之和最小,再加上原有的全部边的边权和即为答案。

3.货郎担问题(旅行商问题)
有n个城市,给定城市之间的道路长(为正无穷大时代表两个城市之间不连通)。一个旅行商从某城出发,要求仅经过每个城市一次,最后回到出发城市。问:如何走才能使他走的路线最短?
对应的图论模型是:设n阶完全带权图G(V, E, W),求G的一条最短的哈密顿回路。
该问题属于NP问题中的一个,目前没有找到有效的时间复杂度可以接受的算法求解。虽然可以采用动态规划求解,但其时间复杂度仍然是指数级的。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值