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)的形式表示。每条高速公路
e∈E
连接两个城市,公路的长度记为le。你想要从城市s 到城市t,但是你的汽车油箱容量有限,在加满的情况下只能行驶L公里。每个城市都有加油站,但城市之间的高速公路上没有加油站。因此,您选择的路径中的每条边木两个城市间的高速公路朩e的长度应该满足
le≤L
。
1. 在给定汽车油箱容量限制的情况下,怎样在线性时间内判断从s到t 之间是否存在一条可行路径;
2. 您现在打算买一辆新车,需要知道从s旅行至t所需的油箱最小容量。给出一个时间复杂度为O((n+m)log(n))的算法,计算从s旅行至t所需的油箱最小容量。
problem 6.30
给定一个有向图 G=(V,E) ,其中的边具有权重木权值可以为负,并且任意两个顶点之间的最短路径最多含有k条边。给出一个算法,在 O(k⋅m) 时间内找出顶点u和v 之间的最短路径。
答:
d(v, k):SP distance from s to v using
≤
k edges.
我们的目标是:
d(u,k−1)⇒d(v,k)
递推公式:
d(v,k)=minu∈N(v){d(v,k−1)+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,k−1),dist(i,k,k−1)+dist(k,j,k−1)}
???这第三个参数TM到底是什么鬼???
problem 6.24
- undirected graph
- ?
- directed graph
- ?
- ?
- Bellman-Ford算法
problem 6.22
- 设当图有n个点的时候有一条哈密顿路径,当加入第n+1个点的时候,从第一个点开始判断 Vn+1 与 V1.....n+1 之间的箭头方向