Floyd算法:求最短路的一种算法(最暴力的方法)复杂度O(n3)
特点:速度慢,但是任意起点的(与Dijkstra不同),程序不难,但很多题目都是变式,需要较深的理解(原理是动态规划)
标程:
#include <cstdio>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,t,a,b,c;
int f[105][105];
int main()
{
//有n个端点,m条边
cin >> n >> m >> t;
//初始化
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (i==j) f[i][j]=0;
else f[i][j]=INF;
}
//输入边
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
f[a][b]=c;
}
//核心代码
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
//查询
for (int i=1;i<=t;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",f[a][b]);
}
return 0;
}
核心代码(4行):
for