Floyd 算法详解
2018-06-29 06:14:45来源:博客园 阅读 ()
Floyd-Warshall
Floyd算法,是一种著名的多源最短路算法。
核心思想:
用邻接矩阵存储图,核心代码为三重循环,第一层枚举中间点k,二三层分别枚举起始点i与目标点j。然后判断经过中间点k后,i与j间的路程是否会减小。如果是,就更新i,j之间的最短路。
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j];
需要注意的是,为了保证更新成功,需要将e数组初始化为无穷大。同时为了防止程序做无意义的到自己的最短路,将每个节点到本身的距离初始化为0。
算法复杂度:
该算法的空间复杂度为n^2(不算优秀,但勉强接受),时间复杂度O(n^3)(呵呵)。
完整代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=99999999;
int n,m,x,y,z,s;
int dis[1001][1001];
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j) dis[i][j]=inf;
else dis[i][j]=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
dis[x][y]=dis[y][x]=z;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];
for(int i=1;i<=n;i++)
printf("%d ",dis[s][i]);
return 0;
}
算法优化:
for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]), dis[j][i] = dis[i][j];
这里利用了矩阵的对称性,只更新一半矩阵即可。但整体时间复杂度还是不够理想,依然是O(n^3)。所以通常n较大时不考虑此算法。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ rand函数 2020-06-10
- OpenCV开发笔记(五十九):红胖子8分钟带你深入了解分水岭 2020-05-24
- 类欧几里得算法 2020-05-16
- 算法笔记刷题6 ( PAT 1003我要通过 ) 2020-05-08
- 无法正确通过算法题目都是哪些原因造成的? 2020-04-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash