- #include <stdio.h>
- #define VERTEX_NUM 3
- #define INFINITY 10000
- #define TRUE 1
- #define FALSE 0
- typedef struct Graph
- {
- char vexs[VERTEX_NUM]; /*顶点*/
- int arcs[VERTEX_NUM][VERTEX_NUM]; /*邻接矩阵*/
- int vexnum; /*顶点数*/
- int arcnum; /*弧数*/
- }Graph;
- void ShortestPath(Graph g, int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM], int d[VERTEX_NUM][VERTEX_NUM])
- {
- /*弗洛伊德算法求每一对顶点之间的最短路径*/
- int v;
- int w;
- int u;
- int i;
- for (v = 0; v < g.vexnum; v++)
- for (w = 0; w < g.vexnum; w++)
- {
- d[v][w] = g.arcs[v][w];
- for (u = 0; u < g.vexnum; u++)
- p[v][w][u] = -1;
- if (d[v][w] < INFINITY) /*从v到w有直接路径*/
- {
- p[v][w][v] = w;
- }
- }
- for (u = 0; u < g.vexnum; u++)
- for (v = 0; v < g.vexnum; v++)
- for (w = 0; w < g.vexnum; w++)
- if (d[v][u] + d[u][w] < d[v][w]) /*从v经u到w的一条路径更短*/
- {
- d[v][w] = d[v][u] + d[u][w];
- for (i = 0; i < g.vexnum; i++)
- {
- if (p[v][u][i] != -1)
- p[v][w][i] = p[v][u][i];
- else
- p[v][w][i] = p[u][w][i];
- }
- }
- }
- void PrintPath ( Graph g, int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM], int d[VERTEX_NUM][VERTEX_NUM] )
- {
- /*输出最短路径*/
- int i,j,k;
- for (i = 0; i < g.vexnum; i++)
- {
- for (j = 0; j < g.vexnum; j++)
- {
- printf( "Path %c to %c:/n" ,g.vexs[i],g.vexs[j]);
- if ( p[i][j][i] == i ) /*顶点到自身*/
- printf( "%c/n" ,g.vexs[i]);
- else if ( p[i][j][i] == -1 ) /*没有路径*/
- printf( "No path!/n" );
- else /*存在路径则输出*/
- {
- for (k = i; k != -1; k = p[i][j][k])
- {
- if (k != i)
- printf( "→" );
- printf( "%c" ,g.vexs[k]);
- }
- printf( "/n" );
- }
- printf( "Length:%d/n" ,d[i][j]);
- printf( "/n" );
- }
- }
- }
- void main()
- {
- int i,
- j;
- Graph g;
- int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM];
- int d[VERTEX_NUM][VERTEX_NUM];
- /*初始化图g*/
- g.vexs[0]= 'A' ,g.vexs[1]= 'B' ,g.vexs[2]= 'C' ;
- for (i=0;i<VERTEX_NUM;i++)
- for (j=0;j<VERTEX_NUM;j++)
- {
- if (i == j)
- g.arcs[i][j]=0;
- else
- g.arcs[i][j]=INFINITY;
- }
- g.arcs[0][1]=4,g.arcs[0][2]=11,g.arcs[1][0]=6,g.arcs[1][2]=2,
- g.arcs[2][0]=3;
- g.vexnum=VERTEX_NUM;
- g.arcnum=5;
- /*输出图的有关信息*/
- for (i=0;i<VERTEX_NUM;i++)
- {
- printf( "%c/t" ,g.vexs[i]);
- for (j=0;j<VERTEX_NUM;j++)
- {
- printf( "%5d " ,g.arcs[i][j]);
- }
- printf( "/n" );
- }
- ShortestPath(g,p,d);
- PrintPath(g,p,d);
- }
弗洛伊德算法求每一对顶点之间的最短路径
最新推荐文章于 2019-06-05 09:00:58 发布