弗洛伊德算法详解

来源:互联网 发布:计算机编程语言艺术 编辑:程序博客网 时间:2024/05/16 12:18

(1)读取“直接相连的两路口之间的距离”文件,并将其保存到矩阵graph.arcs[i][j]中,其中graph.acrs[i][j].length表示,两个直接相连的路口i到j之间的距离。

(2)建立一个三维矩阵p[i][j][k].其代表含义为:若路口i到路口j的最短路径中含有路口k,则p[i][j][k]=1,否则p[i][j][k]=0.根据graph.acrs[i][j].length如果为无穷大值则说明i路口与j路口无直接相连点,否则说明i路口与j路口直接相连。

(3)根据(2)的定义,对矩阵p进行初始化。默认p[i][j][k]=0,若路口i与路口j直接相连,则p[i][j][i]=1,p[i][j][j]=1。否则,

        p[i][j][i]=0,p[i][j][j]=0。

(4)建立二维矩阵D,D[i][j]代表路口点i到路口点j的最短距离。如果D[v][u]+D[u][w]<D[v][w],则说明在路口u和路口w之间,存在路口u,使得路口v经过u连接路口w所经过的距离更短。更新矩阵 D[v][w]=D[v][u]+D[u][w]。并且更新矩阵p[v][w][u]=1,说明连接路口v和路口w的最短路径经过路口v。按照此规则迭代任意两个路口,则任意两路口之间的最短距离就被保存在矩阵D中。

(5)将矩阵D输出,保存到“任意两路口之间的最短距离”文件中。

 

 

 

#include<string.h>#include<stdio.h>#define MAX_VERTEX_NUM 100#define INFINITY 1000000#define error      0#define ok         1typedef struct ArCell//路径信息{double length;    //路径长度}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct   {int  id;//位置编号}infotype;typedef struct{infotype vexs[MAX_VERTEX_NUM];//储存结点信息的数组AdjMatrix arcs;//邻接矩阵int vexnum,arcnum;//边数、结点数}MatrixGraph;MatrixGraph InitGraph(){int number=92;//总共有number个点MatrixGraph graph;//直接将一个图作为返回值返回出去int i,j;    FILE *fp;fp=fopen("路径.txt", "r");//各个点之间的,存放两点之间的路径的文件   graph.vexnum=number;   for(i=0;i<graph.vexnum;i++)   {   graph.vexs[i].id=i;   }if(!fp){printf("打开点之间的距离失败,请检查错误!\n");}else{for(i=0;i<number;i++){for(j=0;j<number;j++){            fscanf(fp, "%lf",&graph.arcs[i][j].length );//将景点之间的距离进行存储}}}fclose(fp);    return graph;}int p[92][92][92];double D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//储存最短路径的矩阵void Floyd(MatrixGraph mg)//用Floyd算法求两点之间最短路径{    FILE *fp;    fp=fopen("各警点到各路口的时间.xls","w+"); int v,u,i,w,k,j,flag=1; for(v=0;v<mg.vexnum;v++) { for(w=0;w<mg.vexnum;w++) { D[v][w]=mg.arcs[v][w].length;//将长度矩阵复制到D[][]这个矩阵中 for(u=0;u<mg.vexnum;u++) {p[v][w][u]=0;//不存在从v结点到w结点途中经过u结点的路径 } if(D[v][w]<INFINITY){//vw之间是否有直接的通路 p[v][w][v]=1; p[v][w][w]=1; } }  } // printf("YES\n"); /*从v到wu为中间结点u<v & u<w*/ for(u=0;u<mg.vexnum;u++) {  for(v=0;v<mg.vexnum;v++) {   for(w=0;w<mg.vexnum;w++) {    if(D[v][u]+D[u][w]<D[v][w]) {D[v][w]=D[v][u]+D[u][w];for(i=0;i<mg.vexnum;i++) {p[v][w][i]=p[v][u][i]||p[u][w][i];//??}    }//end if   }//第三个for  }//第二个for }//第一个for while(flag) {printf("请输入出发点和目的地的编号:\n");scanf("%d%d",&k,&j);if(k<0||k>mg.vexnum||j<0||j>mg.vexnum) {printf("景点编号不存在!请重新输入出发点和目的地的编号:");scanf("%d%d",&k,&j);}if(k>=0 && k<mg.vexnum && j>=0 && j<mg.vexnum)flag=0; } printf("%d",mg.vexs[k].id); for(u=0;u<mg.vexnum;u++) {if(p[k][j][u]&&k!=u&&j!=u)//cout<<"-->"<<mg.vexs[u].name;printf("--->%d",mg.vexs[u].id); } printf("--->%d",mg.vexs[j].id); printf("\n最短路长为:"); printf("%lf\n",D[k][j]); for(j=0;j<92;j++)  {   for(i=0;i<92;i++)   fprintf(fp,"%lf\t",D[i][j]/10);   fprintf(fp,"\n");  }}int main(){    MatrixGraph graph= InitGraph();int i,j;    Floyd(graph);}

0 0
原创粉丝点击