floyd算法求最短路径_《数据结构与算法分析》——“图论”——多源最短路径问题...

bd5c599693dd4e3e418e4a5e82afa4f8.png

简介:

给定一个带权图(有向无向皆可),找出每个顶点到其他所有顶点的最短距离。

描述:

此处介绍O(n^3)级别的Floyd算法,只需要用三层循环的简单代码就完成所有最短距离的计算。唯一需要注意的,就是三层循环里i、j、k的摆放顺序。

代码非常简单,所以无需多作解释了。

0ff0f1f2194905f6d6a93eee39943982.png

实现:

 1 // A simple illustration for all pairs shortest path using Floyd Algorithm. 2 #include  3 #include  4 using namespace std; 5  6 const int INFINITY = 1000000000; 7  8 void floydAlgorithm(const vector > &graph,  9 vector > &dist)10 {11 int n;12 int i, j, k;13 14 n = (int)graph.size();15 dist.resize(n);16 for (i = 0; i < n; ++i) {17 dist[i].resize(n, INFINITY);18 }19 20 for (i = 0; i < n; ++i) {21 for (j = 0; j < n; ++j) {22 dist[i][j] = graph[i][j];23 }24 }25 26 for (k = 0; k < n; ++k) {27 for (i = 0; i < n; ++i) {28 for (j = 0; j < n; ++j) {29 if (dist[i][k] + dist[k][j] >= dist[i][j]) {30 continue;31 }32 dist[i][j] = dist[i][k] + dist[k][j];33 }34 }35 }36 }37 38 int main()39 {40 vector > graph;41 vector > dist;42 int n;43 int nk;44 int i, j;45 int tmp, tmp_dist;46 47 while (cin >> n && n > 0) {48 graph.resize(n);49 for (i = 0; i < n; ++i) {50 graph[i].resize(n, INFINITY);51 }52 53 for (i = 0; i < n; ++i) {54 cin >> nk;55 for (j = 0; j < nk; ++j) {56 cin >> tmp >> tmp_dist;57 graph[i][tmp] = tmp_dist;58 }59 }60 61 floydAlgorithm(graph, dist);62 63 for (i = 0; i < n; ++i) {64 for (j = 0; j < n; ++j) {65 cout << "[" << i << "][" << j << "]: ";66 if (dist[i][j] < INFINITY) {67 cout << dist[i][j] << endl;68 } else {69 cout << "Unreachable" << endl;70 }71 }72 }73 74 for (i = 0; i < n; ++i) {75 graph[i].clear();76 }77 graph.clear();78 79 for (i = 0; i < n; ++i) {80 dist[i].clear();81 }82 dist.clear();83 }84 85 return 0;86 }

说在前面:小伙伴们在学习的过程中难免会遇到很多的困难,有的是初学不知道如何入手,亦或是想要继续提升自己,小编为了帮助大家解决学习问题,大家可以点击上方我的头像私信我发送:“学 习”两个字,我将会针对性的帮助解答你学习上的问题和发送你学习资料哦,大家一起进步

83a4c2658ec51c8e81a4b14e184271aa.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值