Floyd--Warshall算法——最短路径

弗洛伊德算法(Floyd)

简介:

主要用来解决任意两点间的最短路径的一种算法(不能解决带有“负权回路”即“负权环”的图,因为它没有最短路径)
时间复杂度为O(N3),空间复杂度为O(N2)

算法思路:

将相关数据用邻接矩阵储存(邻接矩阵详解),
若两个点间没有联系,则赋值为
*之后对矩阵进行更新,每次选取一个点作为经过点,比较该路线与之前的大小,选取较小的,更新数据,重复以上操作。

例题展示

洛谷:B3647 【模板】Floyd
题目描述
给出一张由 n 个点 m 条边组成的无向图。
求出所有点对 (i,j) 之间的最短路径。
输入格式
第一行为两个整数 n,m,分别代表点的个数和边的条数。
接下来 m 行,每行三个整数 u,v,w,代表
u,v 之间存在一条边权为 w 的边。
输出格式
输出 n
n 行每行 n 个整数。
第 i 行的第 j 个整数代表从 i 到 j 的最短路径。
输入
4 4
1 2 1
2 3 1
3 4 1
4 1 1
输出
0 1 2 1
1 0 1 2
2 1 0 1
1 2 1 0

#include<bits/stdc++.h>//Floyd最短路径 
using namespace std;
const int N=1e2+50;
const int M=1e9+20;
int a[N][N];
int main()
{
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		a[i][j]=M;
		a[j][j]=0;//自己到自己点位距离为0
	}//初始化邻接矩阵 
	int q,w,e;
		for(int i=1;i<=m;i++)
	{
		cin>>q>>w>>e;
		a[q][w]=a[w][q]=min(a[q][w],e);
	}

	for(int k=1;k<=n;k++)//以第K个点为经过点,进行遍历,选出最短路径 
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			cout<<a[k][i]<<" ";
		}cout<<endl;
	}
	
	return 0;
}
上一篇:超越 Transformer 和 Mamba,大模型开启新纪元!


下一篇:前端基础面试题·第四篇——Vue(其一)