核心代码
多源最短路径
Floyd—Warshall
//k为开通的中转站,
//如果由k站中转得到的路程比原路程少则更改最短路程
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(e[i][j]>e[i][k]+e[k][j])
e[i][j] = e[i][k]+e[k][j];
// for(e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k]+e[k][j])
单源最短路径
Dijkstra算法———通过边实现松弛
void f()
{
for(i=1;i<=n-1;j++)//从节点1开始,n-1次将最近点的估计值变成确定值
{
//找到离1号顶点最近的顶点
min=inf;
for(j=1;j<=n;j++)
{
//未有确定值且值小于已知最小
if(book[j]==0 && dis[j]<min)
{
min=dis[j];
u=j;
}
}
//找到离节点1最近的点,到该点的最短路程又估计值变为确定值
//标记,说明已经找到从i点到u点的最短距离
book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<inf)//u到v有路可走
{
//若直接从i点到v点的距离>从i点到u点再从u点到v的距离
//则更改最小值
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
}

浙公网安备 33010602011771号