目录
简介:
Floyd算法,是一种用于求解所有节点对之间最短路径的动态规划算法。它能够在有向图或带权无向图中找到任意两个节点之间的最短路径。
核心思想:
Floyd算法的核心思想是通过逐步改进路径的选择来逐渐求得最短路径。该算法使用一个二维的距离矩阵来记录任意两个节点之间的最短路径长度,并通过不断更新这个矩阵来逐步优化路径。
算法步骤:
-
初始化距离矩阵:将距离矩阵初始化为图中节点之间的直接距离。如果两个节点之间没有直接连接,则将距离设置为无穷大。
-
通过遍历每一个节点k,尝试将节点k作为路径上的中间节点,更新距离矩阵中的路径长度,具体地,对于每对节点i和j,如果从节点i经过节点k到达节点j的路径比当前的最短路径更短,则更新距离矩阵中的路径长度。
-
重复第二步,对于每一个节点k,继续尝试更新距离矩阵中的路径长度,直到遍历完所有节点。
-
最后,距离矩阵中的值就是任意两个节点之间的最短路径长度。
例题:
蓝桥杯题目链接:lhttps://www.lanqiao.cn/problems/1121/learning/?page=1&first_category_id=1&second_category_id=8
1.题目描述:
公园有N个景点,景点与景点之间一共有M条道路。小明有Q个观景计划,每个计划包含一个起点st和一个终点ed,表示他想从st到ed。但是小明的体力有限,对于每个计划他想走最少得路完成,你可以帮他吗?
2.输入描述:
输入第一行包含三个正整数,N,M,Q
第2到M+1行每行包含三个正整数u,v,w,表示u<->v之间存在一条距离为w的路。
第M+2到M+Q-1行每行包含两个正整数st,ed,其含义如题所述。
3.输出描述:
输出共Q行,对应输入数据中的查询。
若无法从st到达ed则输出-1。
#include <bits/stdc++.h>
using namespace std;
long long s[405][405];
long long ans;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
int main()
{
long long w;
int st,ed;
int n,m,q;
int u,v;
cin>>n>>m>>q;
memset(s,0x3f,sizeof(s));
for (int i = 1; i <= n; i++) s[i][i] = 0;
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
s[u][v] =s[v][u] = min(s[u][v], w);
}
for(int k=1;k<=n;++k)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
s[i][j]=min(s[i][j],s[i][k]+s[k][j]);
}
}
}
for(int i=0;i<q;i++)
{
cin>>st>>ed;
ans = s[st][ed] == INF ? -1 : s[st][ed];
cout << ans << endl;
}
return 0;
}