首先是单源最短路问题,肯定是Dijkstra算法:
实现原理:
每次收入一个已求得最短路的点的时候,修正其邻接点到源头的最短路径,逐一修正,最后得到所有的最短路。
实现代码:
#define MAXVEX 9
#define INFINITY 65535
typedef int Patharc[MAXVEX] /*用来存储最短路径下标的数组*/
typedef int ShortPathTable[MAXVEX] /*用来存储到各点最短路径的权值和*/
void ShortestPath_Dijkstra(MGraphy G,int v0,Patharc *P,ShortPathTable *D)
{
int v,w,k,min;
int final[MAXVEX];
for(v=0;v<G.numVertexes;v++){
final[v]=0;
(*D)[v]=G.arc[v0][v];
(*P)[v]=0;
}
(*D)[v0]=0;
final[v0]=1;
/*开始主循环,每次循环求得v0到某个点v得最短路径*/
for(v=1;v<G.numVertexes;v++){
min=INFINITY;
for(w=0;w<G.numVertexes;w++){
if(!final[w]&&(*D)[w]<min){
k=w;
min=(*D)[w];
}
}
final[k]=1;
for(w=0;w<G.numVertexes;w++){
if(!final[w]&&min+G.arc[k][w]<(*D)[w]){
(*D)[w]=min+G.arc[k][w];
(*P)[w]=k;
}
}
}
}
接下来是多源最短路的问题,即Floyd算法:
实现思路:
其实就是一个相当暴力的算法,三重循环,进行遍历。
实现代码:
typedef int Pathmatirx[MAXVEX][MAXVEX] /*用来存储最短路径下标的数组*/
typedef int ShortPathTable[MAXVEX][MAXVEX] /*用来存储到各点最短路径的权值和*/
void ShortestPath_Floyd(MGraphy G,Pathmatirx *P,ShortPathTable *D)
{
int v,w,k;
for(v=0;v<G.numVertexes;++v){
for(w=0;w<G.numVertexes;++w){
(*D)[v][w]=G.matirx[v][w];
(*P)[v][w]=w;
}
}
for(k=0;k<G.numVertexes;++k){
for(v=0;v<G.numVertexes;++v){
for(w=0;w<G.numVertexes;++w){
if((*D)[v][w]>(*D)[v][k]+(*D)[k][w]){
(*D)[v][w]=(*D)[v][k]+(*D)[k][w];
(*P)[v][w]=(*P)[v][k];
}
}
}
}
}
而最短路径的显示代码可以这么写:
for(v=0;v<G.numVertexes;v++){
for(w=v+1;w<G.numVertexes;w++){
printf("v%d-v%d weight: %d",v,w,D[v][w]);
k=P[v][w];
printf(" path: %d",v);
while(k!=w){
printf(" -> %d",k);
k=P[k][w];
}
printf(" -> %d\n",w)
}
printf("\n");
}
这里稍微注意一点,Floyd算法里的P[v][w]代表从v到w这条路径上从v开始走的第一步。