求有向带权图中每两个顶点之间的距离和路径
代码实现:
#include<iostream>
#include<malloc.h>
#define MaxVertexNum 100
#define INFINITY 10000
using namespace std;
typedef struct{
int vertex[MaxVertexNum];
int Edge[MaxVertexNum][MaxVertexNum];
int vertexNum,EdgeNum;
}MGraph;
void CreateMGraph(MGraph *G)
{
int i,j,k,w;
printf("请输入图的顶点数和边数:");
cin>>G->vertexNum>>G->EdgeNum;
printf("请输入图的各个顶点的信息(A,B…):");
for(i=0;i<G->vertexNum;i++)
cin>>G->vertex[i];
for(i=0;i<G->vertexNum;i++)
{
for(j=0;j<G->vertexNum;j++)
G->Edge[i][j]=INFINITY;
}
printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
for(k=0;k<G->EdgeNum;k++)
{
int Iindex,Jindex,weight;
cin>>Iindex>>Jindex>>weight;
G->Edge[Iindex][Jindex]=weight;
}
}
void DisplayMGraph(MGraph G)
{
int i,j;
printf(" ");
for(i=0;i<G.vertexNum;i++)
printf("%d\t",G.vertex[i]);
for(i=0;i<G.vertexNum;i++)
{
printf("\n%d\t",G.vertex[i]);
for(j=0;j<G.vertexNum;j++)
printf("%d\t",G.Edge[i][j]);
}
}
void shortestPathFloyd(MGraph G)
{
int i,j,k;
int distance[G.vertexNum][G.vertexNum];
int parentPath[G.vertexNum][G.vertexNum];
for(i=0;i<G.vertexNum;i++)
{
for(j=0;j<G.vertexNum;j++)
{
if(i==j)
distance[i][j]=0;
else
distance[i][j]=G.Edge[i][j];
}
}
for(i=0;i<G.vertexNum;i++)
for(j=0;j<G.vertexNum;j++)
parentPath[i][j]=-1;
for(k=0;k<G.vertexNum;k++)
{
for(i=0;i<G.vertexNum;i++)
{
for(j=0;j<G.vertexNum;j++)
{
if(distance[i][k]+distance[k][j]<distance[i][j])
{
distance[i][j]=distance[i][k]+distance[k][j];
parentPath[i][j]=k;
}
}
}
}
printf("图中每两点之间的最短路径矩阵如下:");
printf("\n ");
for(i=0;i<G.vertexNum;i++)
printf("%d\t",G.vertex[i]);
for(i=0;i<G.vertexNum;i++)
{
printf("\n%d ",i);
for(j=0;j<G.vertexNum;j++)
printf("%d\t",distance[i][j]);
}
printf("\n\n前驱结点数组为:\n");
for(i=0;i<G.vertexNum;i++)
printf("%d\t",G.vertex[i]);
for(i=0;i<G.vertexNum;i++)
{
printf("\n%d ",i);
for(j=0;j<G.vertexNum;j++)
printf("%d\t",parentPath[i][j]);
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
shortestPathFloyd(G);
return 0;
}
测试数据:
5 7
0 1 2 3 4
0 2 1
0 4 10
1 3 1
1 4 5
2 1 1
2 4 7
3 4 1
测试结果: