最短路算法(1)——floyd算法

本章将介绍原理及floyd的算法实现。

最短路特点

最短路的意思是给出若干条边,求两个点之间的最短路径。

要注意的是顺序也很重要,i到j的最短路径不一定等于j到i的最短路径。

最短路在不同的题目下要使用不同的算法,有的算法能处理负权边(或负环),有的不能。

当然,每个算法的时间复杂度也不一样。

floyd特点

1.floyd可以求出任意两点之间的最短路。

2.可以处理任何情况(如负边,负环)。

3.时间复杂度为O(n^3)。

floyd原理

容易发现,两个点之间的最短路是由至少一条边构成的。

设dp[i][j]表示i到j的最短路,那么就枚举中转点,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]),k为1到n。

floyd就是根据最短路的这个特性,先把一条边的最短路存起来,然后枚举每个点作为中转点,逐步求出任意两个节点间的最短路。

但是在枚举的过程中,要注意先枚举k,再枚举i和j。因为如果不先枚举k,那么有些地方的最短路还没求出来就要用来转移了,显然这样做最后的答案是错的。

代码实现

#include
using namespace std;
int n,m,b[110][110],q,l,r,w;
int dp[101][101];//dp[i][j]表示从i到j的最短路 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dp[i][j]=1e9;//初始化 
		}
	}
	for(int i=1;i<=m;i++){
		cin>>l>>r>>w;
		dp[l][r]=w;//建图 
	}
	for(int k=1;k<=n;k++){//先枚举k 
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);//floyd重点 
			}
		}
	}
	cin>>q;//问题数量 
	for(int i=1;i<=q;i++){
		cin>>l>>r;
		cout<

你可能感兴趣的:(算法,算法,数据结构)