单源最短路径(single-source shortest paths)
1.给定带权图G=<V,E>,其中每条边(vi,vj)上的权W[vi,vj]是一个非负实数。计算从任给的一个源点s到其他各节点的最短路径
Dijkstra算法基本思想
1.把所有结点分成两组
- 第一组U包括已确定最短路径的结点
- 第二组V-U包括尚未确定最短路径的结点
2.按最短路径长度递增的顺序逐个把第二组的结点加到第一组中
- 直至从s出发可达结点都包括进第一组中
void Dijkstra(MGraph g,int v) //求有向网g的v顶点到其余顶点的最短路径
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for(i=0;i<g.n;i++)
{
dist[i]=g.edges[v][i]; //距离初始化
s[i]=0; //s置空
if(g.edges[v][i]<INF) //路径初始化
path[i]=v; //顶点到顶点i有边时,置顶点i的前一个顶点为v
else
path[i]=-1; //顶点到顶点i无边时,置顶点i的前一个顶点为-1
}
s[v]=1;path[v]=0; //源点编号v放入s中
for(i=0;i<g.n;i++) //循环直到所有顶点的最短路径都求出
{
mindis=INF;
for(j=0;j<g.n;j++) //选取不在s中且具有最小距离的顶点u
if(s[j]==0&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1;
for(j=0;j<g.n;j++) //修改不在s中顶点的距离
if(s[j]==0)
if(g.edges[u][j]<INF&&dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
}
Floyed算法求每对结点之间的最短路径
1.用相邻据怎adj来表示带权有向图
2.基本思想
- 初始化adj(0)为相邻矩阵adj
- 在矩阵adj(0)上做n次迭代,递归地产生一个矩阵序列adj(1),...,adj(k),...,adj(n)
- 其中经过第k次迭代,adj(k)[i,j]的值等于从结点vi到结点vj路径上所经过的结点序列不大于k的最短路径长度
算法演示