弗洛伊德算法详解
来源:互联网 发布:计算机编程语言艺术 编辑:程序博客网 时间: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
- flod弗洛伊德算法详解
- 弗洛伊德算法详解
- 弗洛伊德算法详解
- Floyd(弗洛伊德)算法 详解+模板
- 弗洛伊德算法
- 【弗洛伊德算法】
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法
- 弗洛伊德算法求最短路径
- 弗洛伊德(Floyd)算法
- 弗洛伊德(Floyd)算法
- C++实现弗洛伊德算法
- 弗洛伊德(Floyd)算法
- spring的单元测试
- Interface Trip Stop - SRS
- 2015年 代做安卓毕业设计 Android毕业设计
- Spring+Hibernate配置多数据源
- Creating a Customer at the time of creating a Sales Order
- 弗洛伊德算法详解
- OM:Over-ship Tolerance
- 【BZOJ2081】【Poi2010(17th)】Beads RKhash+hash表 请记住这个神一样的数:200019
- js实现简单网速测试方法
- Linux中的文件读写
- SQL*LOADER操作篇
- JAVA IO操作中的IN和OUT问题
- Order Management Useful Scripts
- 汉诺塔IV