最短路径问题

最短路径

1.1 最短路径的定义

这里写图片描述
其数学表现形式为:
最短路径问题中,我们给定一个带权重的有向图G=(V, E) 和权重函数 ω:ER , 该权重函数将每条边映射到实数值的权重上,图中一条路径 p=<v0,v1,...,vk> 的权重 ω(p) 是构成该路径的所有边的权重之和:
δ(p)={ min{ ω(p):uv},,uv
从节点 u 到节点 v 最短路径则定义为任何一条权重 ω(p)=δ(u,v) 的路径p。

最短路径可分为单源最短路径问题和多源最短路径问题。
1. 单源最短路径问题: 给定一个图 G=(V,E) , 我们希望找到从给源节点 sV 到每个节点 vV 的最短路径。
2. 多源最短路径问题 : 求任意两个节点的最短路径。

注意:这里讨论的算法都假设,不存在权重为负值的边并且不存在环路

1.2 单源最短路径

最短路径算法通常依赖最短路径的一个重要的性质:两个节点之间的一条最短路径包含着其他的最短路径。

1.2.1 无权图的最短路径问题

对于无权图来说,我们可以使用广度优先搜索算来进行求解。但是我们需要对BFS算法进行修改。因为,我们需要计算源点到任何节点的最短路径,所以我们需要一个数组dist用来保存最短路径的距离和使用path数组用来保存路径。
及dist[W] = S 到W的最短距离。则有dis[s] = 0 。
path[W] = S到W进过的某个节点。
伪代码为:

void shortestPath(Vertex s) {
    dist[|V|] = -1;//首先对数组进行初始化
    path[|V|];    //定义一个path数组
    queue Q;  //创建一个队列
    Q.push(s);   //将源点插入到队列中
    while (!Q.empty()) {  //如果队列不为空
        v = Q.front(); Q.pop();  //出队列
        for (v的每个邻接点 w) {
            if (dist[w] == -1) {  //如果等于-1表明,我们没有计算该节点
      
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值