Floyd算法求最短路径并记录路径

来源:互联网 发布:js 判断对象未定义 编辑:程序博客网 时间:2024/05/01 16:44

基本模型

从最开始只允许经过1号顶点中转,接下来允许经过1号和2号中转……..允许经过1~n号所有的顶点进行中转,求任意两点间的最短路程。用一句话概括就是:从i号顶点到j号顶点之经过前k号的最短路程。

实例

这里写图片描述
求任意两点之间的最短路径

#include <stdio.h>#define INF 10000int e[4][4]={    0,2,6,4,    INF,0,3,INF,    7,INF,0,1,    5,INF,12,0};int path[4][4] = {0};void floyd(){    int i,j,k;    for(i=0;i<4;i++)        for(j=0;j<4;j++)            for(k=0;k<4;k++)                if(e[i][k]<INF&&e[k][j]<INF&&e[i][j]>e[i][k]+e[k][j]){                    e[i][j] = e[i][k] + e[k][j];                    path[i][j] = k;                }}void getPath(int i ,int j){    if(i==j) return;    if(path[i][j]==0) printf("%c ",j+'a');    else{        getPath(i,path[i][j]);        getPath(path[i][j],j);    }}int main(){    char start,end;    printf("输入起点编号和终点编号:");    scanf("%c %c",&start,&end);    floyd();    printf("最短路径为:%d,具体如下:\n%c ",e[start-'a'][end-'a'],start);    getPath(start-'a',end-'a');    return 0;}

这里写图片描述

0 0
原创粉丝点击