Description
用弗洛伊德算法求任意两点间的最短路径的长度。
Input
先输入一个小于100的正整数n,然后输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),之后再输入一个小于100的正整数m,最后的m行每行输入两个不同的0到n-1之间的整数表示两个点。
Output
用弗洛伊德算法求任意两点间的最短路径的长度,并输出这些两个点之间的最短路径长度。
Sample Input
4
0 2 10 10000
2 0 7 3
10 7 0 6
10000 3 6 0
2
0 2
3 0
Sample Output
9
5
#include<stdio.h>
typedef struct
{
int vexs[100];
int arcs[100][100];
int vexnum,arcnum;
}MGraph;
typedef int sumlength[100][100];
void creat(MGraph *G)
{ int i,j,w;
scanf("%d",&(G->vexnum));
for (i=0; i<G->vexnum; i++)
{
G->vexs[i]=i;
}
for (i=0; i<G->vexnum;i++)
{
for ( j=0; j<G->vexnum;j++)
{
G->arcs[i][j]=10000;
}
}
for ( i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
{
scanf("%d",&w);
if(w!=10000)
G->arcs[i][j]=w;
}
}
}
void floyd(MGraph G,sumlength*D)
{//用floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]。若p[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点
int v,w,u;
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++)
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;
sumlength D;
int i,n;
int start,end;
creat(&G);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&start,&end);
floyd(G,&D);
printf("%d\n",D[start][end]);
}
return 0;
}