最短路径弗洛伊德算法C语言实现__Floyd
2015-08-19 22:34
651 查看
// 采用邻接矩阵表示图
// 简单起见,邻接矩阵(图中各结点间的距离权值)在main函数中直接输入了
// 简单起见,邻接矩阵(图中各结点间的距离权值)在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); }
相关文章推荐
- C++: 整型转字符串
- C语言不通过第三个变量交换a、b两数数值的技巧
- C语言二进制输出
- 03==C语言(运算符,基本数据类型)
- C语言速度优化之指针赋值与if判断
- C++中的智能指针
- C++ Primer Plus 第一章 预备知识
- mysql C语言API接口及实例
- 关于c++派生类构造函数的思考
- 深度优先算法:《啊哈!算法》一书中第四章“解救小哈”例子的 C++ 语言实现
- C语言中,二维数组中,p+1与*(p+1)的区别
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- OC中定义了一个结构体(struct),设置结构体的值
- 嵌入式SQL应用(C语言)
- C文件读写函数介绍
- malloc/free函数
- Effective C++学习笔记四(设计与声明)
- C++多线程学习:生产者消费者问题
- C++继承、虚继承、虚函数类的大小问题
- C/C++的内存分配