全源最短路径:
单源最短路径是求某一个节点到其他节点的最短路径长度及最短路径的节点,最短路径长度用一维数组d[]存储,前驱节点也用一维数组π[]存储,而全源最短路径求的是所有顶点到其他顶点的最短路径及其长度,相当于对所有的顶点求单源最短路径,这时存储最短路径长度就需要二维数组L,存储父顶点路径也需要二维数组
伪代码:
All_Pair_Shortest_path(L,w)
n=row[L];
L=(l[I,j])n*n
For(i=1:n)
For(j=1:n)
For(k=1:n)
L[i,j]=min(L[i,j],L[I,k]+L[k,j])
利用dijkstra算法计算全源最短路径
#include<iostream>
usingnamespace std;
intdistan[5][5];
intfather[5];
int maxnum= 1000;
void relax1(inti, intmin_i, intj, intmap[][5]) {
int c = map[min_i][j];
if (distan[i][min_i] + c < distan[i][j])
{
distan[i][j] = distan[i][min_i] + c;
father[j] = i;
}
}
int main(){
int n = 5;
int map[5][5] = {
{0,5,maxnum,maxnum,10 },//m代表无穷大
{maxnum,0,2,9,3 },
{7,maxnum,0,6,maxnum },
{maxnum,maxnum,4,0,maxnum },
{maxnum,2,maxnum,1,maxnum }
};
int sum;
int tag[5];
int min_i;
int min=maxnum;
for (int i = 0; i < 5;i++)
{
tag[i]= 1;
for(int j=0;j<n;j++)
distan[i][j] = maxnum;
distan[i][i]= 0;
}
for (int i = 0; i < n;i++)
{
sum= n;
for (int i = 0; i < 5;i++)
tag[i]= 1;
while (sum--)
{
min= maxnum;
for (int j = 0; j < n;j++)
if (tag[j] == 1&& distan[i][j] < min)
{
min_i = j;
min= distan[i][j];
}
for (int j = 0; j < n;j++)
relax1(i,min_i,j, map);
tag[min_i]= 0;
}
}
for (int i = 0; i < n;i++)
{
for (int j = 0; j < n;j++)
printf("%d ", distan[i][j]);
printf("\n");
}
return 0;
}