floyd算法
很简单也很好理解,但是时间复杂度很高,O(nnn)。
这种算法可以找多源最短路,想知道a点到b点最短路,只能加入中间点来缩短路径,比如a到b 加入中间点k a到k到b
那么我们可以这样判断,要知道i到j的最短路,我们只要判断e[i][j]是否大于e[i][1]+e[1][j]即可,而中间值1则要用for循环从1到n遍历一个遍,就是查找所有中间值
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define exp 1e-9
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
typedef long long LL;
int map1[100][100]; //i到j的最短路径
int main()
{
int n,m,a,b,c,start,endd;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1;j<=n;j++)
{
if(i==j) map1[i][j]=0;
else map1[i][j]=inf; //初始化
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
map1[a][b]=c;
}
scanf("%d%d",start,endd);
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(map1[i][j]>map1[i][k]+map1[k][j])
map1[i][j]=map1[i][k]+map1[k][j]; //插中间值
}
printf("%d\n",map1[start][endd]);
re