一、单源最短:
1.有向无权图:
//伪代码
/*
dist[w]:w到s最短距离,path[w]:w到s的前一个顶点,
T = O(V+E)
*/
void Unweighted(Vertex S)
{
Enqueue(S, Q);
while(!IsEmpty (Q))
{
V =Dequeue(Q);
for(V 的每个邻接点 W)
if (dist[W]==-1)
{
dist[W] = dist[V]+1;
path[W] = V;
Enqueue(W, Q);
}
}
}
2.有向有权图:
/*
Dijkstra算法:
令S={源点s + 已经确定了最短路径的顶点vi}
对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过
S中的顶点。
*/
/*
直接扫描dist[v]:T=O(V^2 + E)
dist[v]放进最小堆:T=O(ElogV)
*/
void Dijkstra(Vertex s)
{
while(1)
{
V = 未收录顶点中dist最小者;
if(这样的V不存在)
break;
collected[V] = true;
for(V 的每个邻接点W)
{
if ( collected[W] == false )
{
if ( dist[V]+E<V,W> < dist[W])
{
dist[W] = dist[V] + E<V,W>;
path[W] = V;
}
}
}
}
}
二、多源最短
//法一:直接单源调用V遍 T=O(V^3 + E*V)
//法二:Floyd算法: T=O(V^3)
void Floyd()
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
D[i][j] = G[i][j];
path[i][j] = -1;
}
}
for( k = 0; k < N; k++ )
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if( D[i][k] + D[k][j] < D[i][j])
{
D[i][j] = D[i][k] + D[k][j];
path[i][j] = k;
}
}
}
}
}