Dijkstra's Alg as Framawork

Dijkstra’s Framawork
for(all v belong to V)
    dist[v] = ∞;
dist[s] = 0; 
Q = MinPQ(V);
while(Q != null){
    u = deleteMin(Q);
    for(all (u,v) belong to E){
        if(dist[v] > dist[u] + l(u,v)){
            dist[v] = dist[u] + l(u,v);
            decreaseKey(Q, v);
        }
    }
}
problem 6.18

最短路径常常不是唯一的。请设计一个时间复杂度为O((n+m)log(n))的算法,解决以下问题:

  • 输入:无向图G =(V, E),其边权值为正;起始顶点s ∈ V;
  • 输出:一个布尔变量数组U[1..n]:对于每个顶点v,数组元素U[v]取值为TRUE当且仅当从s到u存在唯一的最短路径注意:U[s]=TRUE。

答: num[]代表了存在几条最短路径,usp[]代表了是否存在唯一最短路径。只是在Dijkstra算法进行简要修改。

for(all v belong to V){
    dist[v] = ∞;
    usp[v] = FALSE;
    num[v] = 0;
    }
dist[s] = 0; 
usp[s] = TRUE;
Q = MinPQ(V);
while(Q != null){
    u = deleteMin(Q);
    for(all (u,v) belong to E){
        if(dist[v] > dist[u] + l(u,v)){
            dist[v] = dist[u] + l(u,v);
            decreaseKey(Q, v);
            usp[v] = usp[u];
            num[v] = num[u];
        }
        else{
            usp[v] = FALSE;
            num[v] = num[u] + num[v];
        }
    }
}
problem 6.23

给定一组城市,它们之间以高速公路相连,以无向图G=(V, E)的形式表示。每条高速公路 eE 连接两个城市,公路的长度记为le。你想要从城市s 到城市t,但是你的汽车油箱容量有限,在加满的情况下只能行驶L公里。每个城市都有加油站,但城市之间的高速公路上没有加油站。因此,您选择的路径中的每条边木两个城市间的高速公路朩e的长度应该满足 leL
1. 在给定汽车油箱容量限制的情况下,怎样在线性时间内判断从s到t 之间是否存在一条可行路径;
2. 您现在打算买一辆新车,需要知道从s旅行至t所需的油箱最小容量。给出一个时间复杂度为O((n+m)log(n))的算法,计算从s旅行至t所需的油箱最小容量。

problem 6.30

给定一个有向图 G=(V,E) ,其中的边具有权重木权值可以为负,并且任意两个顶点之间的最短路径最多含有k条边。给出一个算法,在 O(km) 时间内找出顶点u和v 之间的最短路径。

答:
d(v, k):SP distance from s to v using k edges.
我们的目标是: d(u,k1)d(v,k)
递推公式: d(v,k)=minuN(v){d(v,k1)+w(u,v)}

for(all v belong to V){
    d[v] = ∞;
    }
d[s] = 0; 
for(int k=1;k<=n-1;k++)
    for(all v in V)
        for(all u in V)
            d[u] = min{d[v],d[u]+w(u,v)};
problem 6.25

dist(i,j,k)=min{dist(i,j,k1),dist(i,k,k1)+dist(k,j,k1)}
???这第三个参数TM到底是什么鬼???

problem 6.24
  1. undirected graph
  2. directed graph
  3. Bellman-Ford算法
problem 6.22
  1. 设当图有n个点的时候有一条哈密顿路径,当加入第n+1个点的时候,从第一个点开始判断 Vn+1 V1.....n+1 之间的箭头方向
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是 Dijkstra's algorithm 的图示例: 假设我们要找到从节点 A 到节点 F 的最短路径,如下图所示: ![Dijkstra's algorithm example](https://cdn.jsdelivr.net/gh/1096749322/pictures/2021-11-01-10-59-23-image.png) 首先,我们将起始节点 A 的距离设置为 0,其余节点的距离设置为无穷大。然后,我们从 A 开始,遍历它的邻居节点 B 和 D,并更新它们的距离。这样,B 的距离变为 4,D 的距离变为 2,如下图所示: ![Dijkstra's algorithm example 2](https://cdn.jsdelivr.net/gh/1096749322/pictures/2021-11-01-11-00-27-image.png) 接下来,我们选择距离最短的节点 D,并遍历它的邻居节点 C 和 E,并更新它们的距离。这样,C 的距离变为 5,E 的距离变为 6,如下图所示: ![Dijkstra's algorithm example 3](https://cdn.jsdelivr.net/gh/1096749322/pictures/2021-11-01-11-00-44-image.png) 现在,我们选择距离最短的节点 B,并遍历它的邻居节点 C 和 F,并更新它们的距离。这样,C 的距离变为 7,F 的距离变为 8,如下图所示: ![Dijkstra's algorithm example 4](https://cdn.jsdelivr.net/gh/1096749322/pictures/2021-11-01-11-01-01-image.png) 最后,我们选择距离最短的节点 C,并遍历它的邻居节点 F,并更新它的距离。这样,F 的距离变为 9,如下图所示: ![Dijkstra's algorithm example 5](https://cdn.jsdelivr.net/gh/1096749322/pictures/2021-11-01-11-01-18-image.png) 现在,我们已经找到了从节点 A 到节点 F 的最短路径,它的距离为 9,路径为 A → D → E → F。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值