#include <stdio.h>#include<string.h>
#define MAX_NAME 5 typedef int VRType;/*宏定义*/
#define OK 1 #define FALSE 0 #define TRUE 1
#define INFINITY 100000 #define MAX_VERTEX_NUM 20
typedef int DistancMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum; }MGraph;/*定义一个结构体数组,包括记录权值的邻接矩阵数组,总顶点数,以及初始的弧的数目*/
int CreateDN(MGraph *G)/*构建该结构体的函数*/
{
int i,j,k,b;
scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);/*要求输入顶点数,以及弧的数目*/
for(i=0;i<(*G).vexnum;++i)
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j]=INFINITY;/*首先在邻接矩阵内置最大值即+∞,这里的+∞用一个较大的值代替*/
}
for(k=0;k<(*G).arcnum;k++)
{
scanf("%d,%d,%d",&i,&j,&b); /*输入arcnum个弧的信息,起点,终点,以及权值*/
(*G).arcs[i][j]=b;
}
return OK;
}
void ShortestPath_FLOYD(MGraph G,DistancMatrix *D)/*FLOYD算法*/
{
int u,v,w;
for(v=0;v<G.vexnum;v++)
for(w=0;w<G.vexnum;w++)
{
(*D)[v][w]=G.arcs[v][w];/*将结构体内邻接矩阵的信息记入D数组*/
}
for(u=0;u<G.vexnum;u++)/*这才是FLOYD算法的精华部分*/
for(v=0;v<G.vexnum;v++)
for(w=0;w<G.vexnum;w++)
if((*D)[v][u]+(*D)[u][w]<(*D)[v][w])
{
(*D)[v][w]=(*D)[v][u]+(*D)[u][w];
}
}
int main()
{
MGraph g;
int i,j;
DistancMatrix d;
CreateDN(&g);
for(i=0;i<g.vexnum;i++)/*邻接矩阵对角线元素为0*/
g.arcs[i][i]=0;
ShortestPath_FLOYD(g,&d);
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
{
if(i==j)
j++;
if(j>=g.vexnum)
break;
if(d[i][j]==100000)
printf("%d->%d:No Path\n",i,j);
else
printf("%d->%d:%d\n",i,j,d[i][j]);
}
return 0;
}