一、Single Source Shortest Paths(单源最短路径)
Dijkstra’s algorithm
- 对于一个uniformly weighted graph(权值均相同的图),只需要BFS就可以得到。
- Dijkstra’s algorithm
Void shortestPaths(EdgeList[] adjInfo, int n, int s, int[] parent, float[]fringeWgt)
int[] status = new int[n+1];
MinPQ pq = create(n, status, parent, fringeWgt);
insert(pq, s, ‐1, 0);
while(isEmpty(pq)==false)
int v = getMin(pq);
deleteMin(pq);
updateFringe(pq, adjInfo[v], v);
void updateFringe(MinPQ pq, EdgeList adjInfoOfV, int v)
float myDist = pq.fringeWgt[v];
EdgeList remAdj;
remAdj = adjInfoOfV;
while{remAdj != nil}
EdgeInfo wInfo = first(remAdj);
int w = wInfo.to;
float newDist = myDist + wInfo.weight;
if(pq.status[w]==unseen)
insert(pq,w,v,newDist);
else if(pq.status[w] = fringe)
if(newDist < getPriority(pq,w))
decreaseKey(pq,w,v,newDist);
remAdj = rest(remAdj);
return;
正确性证明
略
二、All‐pairs Shortest Path(多源最短路径)
Dijkstra’s 框架延伸
- Single‐source shortest path (SSSP)单源最短路径
- SSSP + node weight constraint
- SSSP + capacity constraint
Warshall’s algorithm
void simpleTransitiveClosure(boolean[][] A, int n, boolean[][] R)
int i,j,k;
Copy A to R;
Set all main diagonal entries, rii, to true;
while (any entry of R changed during one complete pass)
for (k=1; k<=n; k++)
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
rij=rij | (rik & rkj)
Floyd’s algorithm
Void allPairsShortestPaths(float [][] W, int n, float [][] D)
int i, j, k;
Copy W into D;
for (k=1; kn; k++)
for (i=1; in; i++)
for (j=1; jn; j++)
D[i][j] = min (D[i][j], D[i][k]+D[k][j]);