您的位置:首页 > 编程语言 > C语言/C++

最短路径弗洛伊德算法C语言实现__Floyd

2015-08-19 22:34 651 查看
// 采用邻接矩阵表示图

// 简单起见,邻接矩阵(图中各结点间的距离权值)在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);
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: