最短路徑弗洛伊德演算法C語言實現__Floyd
阿新 • • 發佈:2019-02-10
// 採用鄰接矩陣表示圖
// 簡單起見,鄰接矩陣(圖中各結點間的距離權值)在main函式中直接輸入了#include <stdio.h> #include <stdlib.h> #define MAXVEX 9 #define INFINITY 65535 struct MGraph{ int numVertexes; int *vex; int arc[MAXVEX][MAXVEX]; }; typedef int PathMatrix[MAXVEX][MAXVEX]; typedef int ShortPathTable[MAXVEX][MAXVEX]; void ShortestPath_Floyd(MGraph *G,PathMatrix *P,ShortPathTable *D) { int v,w,k; //初始化 for(v=0;v<G->numVertexes;++v) { for(w=0;w<G->numVertexes;++w) { (*D)[v][w]=G->arc[v][w]; (*P)[v][w]=w; } } for(k=0;k<G->numVertexes;++k) { for(v=0;v<G->numVertexes;++v) { for(w=0;w<G->numVertexes;++w) { if( (*D)[v][w]>(*D)[v][k]+(*D)[k][w] ) // (v到w的距離) VS (v到k的距離+k到w的距離) { (*D)[v][w]=(*D)[v][k]+(*D)[k][w]; (*P)[v][w]=(*P)[v][k]; //若從v出發,要去w,則先要從v去到k,“再作下一步打算(下一步即(*P)[k][w])” } } } } } void main() { MGraph *my_g=(struct MGraph*)malloc(sizeof(struct MGraph)); int i,j; int t=0; int v0=0; int vv=8; my_g->numVertexes=MAXVEX; my_g->vex=(int*)malloc(sizeof(char)*my_g->numVertexes); if(!my_g->vex) return; for(i=0;i<my_g->numVertexes;++i) //一維陣列(圖中各結點)初始化{0,1,2,3,4,5,6,7,8} my_g->vex[i]=i++; for(i=0;i<my_g->numVertexes;++i) for(j=0;j<my_g->numVertexes;++j) my_g->arc[i][j]=INFINITY; // 無向圖的權值二維陣列為對稱矩陣 my_g->arc[0][1]=1; my_g->arc[0][2]=5; my_g->arc[1][2]=3; my_g->arc[1][3]=7; my_g->arc[1][4]=5; my_g->arc[2][4]=1; my_g->arc[2][5]=7; my_g->arc[3][4]=2; my_g->arc[3][6]=3; my_g->arc[4][5]=3; my_g->arc[4][6]=6; my_g->arc[4][7]=9; my_g->arc[5][7]=5; my_g->arc[6][7]=2; my_g->arc[6][8]=7; my_g->arc[7][8]=4; for(i=0;i<my_g->numVertexes;++i) for(j=0;j<=i;++j) { if(i==j) { my_g->arc[i][j]=0; continue; } my_g->arc[i][j]=my_g->arc[j][i]; } for(i=0;i<my_g->numVertexes;++i) //二維陣列表示圖中各結點間連線邊的weight { for(j=0;j<my_g->numVertexes;++j) printf("%5d ",my_g->arc[i][j]); printf("\n"); } printf("\n\n"); PathMatrix D; ShortPathTable P; ShortestPath_Floyd(my_g,&P,&D); for(i=0;i<MAXVEX;++i) //二維陣列表示圖中各結點間連線邊的weight { for(j=0;j<MAXVEX;++j) printf("%5d ",P[i][j]); printf("\n"); } printf("\n\n"); free(my_g->vex); }