Floyd算法
求两点之间最小距离,详细求解过程看天勤数据结构高分笔记208页
/**
* 弗洛伊德算法
* @param G
* @param Path 用来记录当前两顶点之间最短路径上要通过的中间顶点
* @param A 记录当前已经求得的任意两个顶点之间的最短路径的长度
*
*/
void Floyd(MGraph G,int Path[][MAX_VERTEX_NUM],int A[][MAX_VERTEX_NUM]){
//对A和Path数组进行初始化
for (int i = 0; i < G.vexnum; ++i) {
for (int j = 0; j < G.vexnum; ++j) {
A[i][j] = G.arcs[i][j].adj;
Path[i][j] = -1;
}
}
//每次增加一个顶点k,并以K为中间点对所有的顶点对(i,j)进行检测和修改
for (int k = 0; k < G.vexnum; ++k) {
for (int i = 0; i < G.vexnum; ++i) {
for (int j = 0; j < G.vexnum; ++j) {
if (A[i][j] > A[i][k] + A[k][j]){
A[i][j] = A[i][k]+A[k][j];
Path[i][j] = k;
}
}
}
}
}
/**
* 输出两点之间的最短路径算法
* @param v1
* @param v2 v1和v2表示两个顶点
* @param Path
* @param A
*/
void printPath_Floyd(int v1,int v2,int Path[][MAX_VERTEX_NUM],int A[][MAX_VERTEX_NUM]){
if (A[v1][v2] == INFINITY){ //表示不可达
return;
} else{
if (Path[v1][v2] == -1){ //表名两个顶点之间直接相连
//输出
printf("%d\t%d\n",v1,v2);
} else{
int mid = Path[v1][v2]; //两个顶点之间的中转点
printPath_Floyd(v1,mid,Path,A);
printPath_Floyd(mid,v2,Path,A);
}
}
}