弗洛伊德算法求无向图最短路
<strong>#include<cstdio>
#include<cstring>
#include<algorithm>
#define MM 0x3f3f3f3f
#define size 1002
using namespace std;
int n,m,j,i,k,l;
int a[size][size],b[size][size];
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m)//输入两个数,n点的总数,m边的总数
{
for(i=0; i<size; i++)
for(j=0; j<size; j++)
{
if(i!=j)
a[i][j]=MM;
else
a[i][j]=0;
b[i][j]=j;
}//初始化两个二维数组
for(i=0; i<m; i++)
{
scanf("%d%d%d",&j,&k,&l);
a[j][k]=l;
a[k][j]=l;
}//输入路经端点和路径长
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j)
continue;
if(a[i][j]>=MM)
continue;
for(k=1; k<=n; k++)
{
if(a[j][k]>a[j][i]+a[i][k])
{
a[j][k]=a[j][i]+a[i][k];
b[j][k]=b[j][i];
}
}
}
}
scanf("%d",&i);//查询的问题数
while(i--)
{
scanf("%d%d",&j,&k);//输入两个点输出之间的最短路
if(a[j][k]<MM)
printf("%d\n",a[j][k]);
else
printf("-1\n");//两点之间没有路
}
printf("结束,\n输入下一个图\n");
}
return 0;
}
/**
21 42
1 2 3
1 3 5
1 8 4
2 3 2
2 4 9
2 6 5
3 8 2
3 7 1
3 11 8
3 6 1
4 6 2
4 12 7
4 5 6
5 13 4
6 11 2
6 12 1
7 8 3
7 10 2
7 11 2
7 18 5
8 9 1
8 10 5
9 19 2
9 10 4
10 19 7
10 18 2
11 18 3
11 14 1
11 17 2
12 14 4
12 13 3
13 15 3
14 17 10
14 15 2
15 16 2
16 17 1
16 21 3
17 21 4
18 19 6
18 20 2
19 20 3
20 21 1
*/</strong>