关于弗洛伊德算法

来源:互联网 发布:数控车床锥度螺纹编程 编辑:程序博客网 时间:2024/06/01 07:18

弗洛伊德算法是求多源最短路径的一种算法。

算法要点:

对于每一对顶点u和v,看看是否存在一个顶点w使得u到w再从w到v比已知路径更短,如果是则更新它。该算法是一种动态规划算法,稠密图效果最佳,边权可正可负。

缺点:时间复杂度较高,不适合计算大量数据。

时间复杂度:N^3

代码:

#include "stdio.h"    #include "stdlib.h"   #include "io.h"  #include "math.h"  #include "time.h"#include <stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXEDGE 20#define MAXVEX 20#define INFINITY 65535typedef struct//定义图{int vexs[MAXVEX];int arc[MAXVEX][MAXVEX];int Nv,Ne;//点数,边数}MGraph;typedef int parc[MAXVEX][MAXVEX];typedef int ShortPath[MAXVEX][M];void CreateG(MGraph *G){int i,j;G->Ne=16;G->Nv=9;for(int i=0;i<G->Nv;i++){G->vexs[i]=i;}for(i=0;i<G->Nv;i++){if(i==j)G->arc[i][j]=0;elseG->arc[i][j]=G->arc[j][i]=INFINITY;}}G->arc[0][1]=1;G->arc[0][2]=5; G->arc[1][2]=3; G->arc[1][3]=7; G->arc[1][4]=5; G->arc[2][4]=1; G->arc[2][5]=7; G->arc[3][4]=2; G->arc[3][6]=3; G->arc[4][5]=3;G->arc[4][6]=6;G->arc[4][7]=9; G->arc[5][7]=5; G->arc[6][7]=2; G->arc[6][8]=7;G->arc[7][8]=4;for(i=0;i<Nv;i++){for(j=i;j<Nv;j++){G->arc[j][i]=G->arc[i][j];}}void Floryed(MGraph G,parc *P,ShortPath *D){int v,w,k;for(v=0;v<G->Nv;++v)//初始化D与P{for(w=0;w<Nv;++w){(*D)[v][w]=G.arc[v][w];(*P)[v][w]=w;}}for(k=0;k<G->Nv;k++){for(v=0;v<G-Nv;v++){for(w=0;w<G->Nv;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];}}}}}

原创粉丝点击