#include<stdio.h>
#include<stdlib.h>
typedef int VertexType;//顶点类型
typedef int EdgeType;
#define MAXVEX 100//最大顶点数
#define MAXEDGE 200//最大边数
#define INFINITY 65535//代表无穷大,两个顶点之间不可达
int visited[MAXVEX];//访问标志的数组
typedef struct{
VertexType vexs[MAXVEX];//顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
int numVertexes,numEdges;//图中当前的顶点数和边数
}MGraph;
void CreateMGraph(MGraph * G)
{
int i,j,k,w;
printf("输入顶点数和边数:");
scanf("%d %d",&G->numVertexes,&G->numEdges);
printf("输入顶点:");
for(i=0;i<G->numVertexes;i++)
scanf("%d",&G->vexs[i]);
// getchar();
for(i=0;i<G->numVertexes;i++)
for(j=0;j<G->numVertexes;j++)
G->arc[i][j]=INFINITY;//邻接矩阵初始化
for(k=0;k<G->numEdges;k++)
{
printf("请输入vi vj的下标i j和对应的权值:");
scanf("%d %d %d",&i,&j,&w);
G->arc[i][j]=w;
G->arc[j][i]=G->arc[i][j];//无向图,邻接矩阵对称
}
}
void Floyd(MGraph G)
{
int v,w,k;
int p[MAXVEX][MAXVEX];//保存路径的数组
int d[MAXVEX][MAXVEX];//保存权值的数组
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;//a--->b初始时的最短路径就是a-b
}
}
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]))
{
d[v][w]=d[v][k]+d[k][w];//更新最短长度
p[v][w]=p[v][k];//更新经过的结点路径
}
}
}
}
//--------输出最短路径
for(v=0;v<G.numVertexes;v++)
{
for(w=v+1;w<G.numVertexes;w++)
{
printf("(%d,%d)--%d ",v,w,d[v][w]);
k=p[v][w];
printf("path: %d",v);
while(k!=w)
{
printf("-> %d",k);
k=p[k][w];//获得下一个路径顶点下标
}
printf("-> %d\n",w);
}
printf("\n");
}
}
int main()
{
MGraph *G;
G=(MGraph*)malloc(sizeof(MGraph));
CreateMGraph(G);
Floyd(*G);
return 0;
}
/*
0 1 1
0 2 5
1 2 3
1 3 7
1 4 5
2 4 1
2 5 7
3 4 2
3 6 3
4 6 6
4 7 9
4 5 3
5 7 5
6 7 2
6 8 7
7 8 4
时间复杂度O(n^3)
*/