Floyd最短路
适用于多源最短路
思路
邻接矩阵存储权值
基于动态规划,即从 i 点到 j 点,会经过 k 点, 遍历这三个点取min(dist[i , k ]+ dis[k , j], dis[i , j])
三重循环
题目
Floyd求最短路
代码 :
#include <bits/stdc++.h>
using namespace std;
const int N = 210;
int all[N][N] , n , m , k , x , y ,z, a ,b;
void floyd()//三重循环
{
for(int k = 1 ; k <= n ; k ++)
{
for(int i = 1 ; i <=n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
{
all[i][j] =min(all[i][j] , all[i][k] + all[k][j]);//更新
}
}
}
}
int main()
{
memset(all, 0x3f3f3f , sizeof all);
cin>>n>>m>>k;
for(int i = 1 ; i <= n ;i ++)
{
all[i][i] = 0;//eg:从1点到1点的距离为0
}
for(int i = 0 ; i < m ; i ++)
{
cin>>x >>y>>z;
all[x][y] = min(all[x][y] ,z);
}
floyd();
while(k--)
{
cin>>a>>b;
if(all[a][b]> 0x3f3f3f3f/2) cout<<"impossible"<<endl;//有可能存在负边,回比0x3f3f3f3f小
else cout<<all[a][b]<<endl;
}
return 0;
}
#小菜鸟再也不水课了,自己补知识点脑壳大了
#(个人学习使用)