设计最短路径算法,编程实现求任意两顶点之间的最短路径。
时间: 2024-03-08 11:46:56 浏览: 68
最短路径算法有多种,其中比较常用的是Dijkstra算法和Floyd算法。下面我将分别介绍这两种算法。
1. Dijkstra算法
Dijkstra算法是一种贪心算法,用于求解有权重图中,从一个源节点到其它所有节点的最短路径。它的基本思想是:维护一个集合S,存放已经找到最短路径的节点,以及一个数组d,表示源节点到每个节点的最短路径长度。初始时,集合S为空,d数组中除源节点外,其它节点的值均为无穷大。然后每次从未加入集合S的节点中选取距离源节点最近的节点u,并将其加入集合S中。然后以u为中间节点,更新源节点到其它节点的最短距离。重复执行上述步骤,直到所有节点都加入集合S中。
C++代码实现:
```
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int h[N], e[N], w[N], ne[N], idx;
int d[N], vis[N];
int n, m;
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
void dijkstra()
{
memset(d, 0x3f, sizeof d);
d[1] = 0;
for (int i = 0; i < n; i ++ )
{
int t = -1;
for (int j = 1; j <= n; j ++ )
if (!vis[j] && (t == -1 || d[t] > d[j]))
t = j;
vis[t] = 1;
for (int j = h[t]; ~j; j = ne[j])
{
int k = e[j];
if (d[k] > d[t] + w[j])
d[k] = d[t] + w[j];
}
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
while (m -- )
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
dijkstra();
if (d[n] == 0x3f3f3f3f) puts("-1");
else cout << d[n] << endl;
return 0;
}
```
2. Floyd算法
Floyd算法是一种动态规划算法,用于求解有权重图中,任意两点之间的最短路径。它的基本思想是:设d[i][j]表示从i到j的最短路径长度,初始时,d[i][j]等于i到j的边的权重,若i到j没有边,则d[i][j]为无穷大。然后枚举中间节点k,若d[i][j] > d[i][k] + d[k][j],则更新d[i][j]为d[i][k] + d[k][j]。
C++代码实现:
```
#include <iostream>
#include <cstring>
using namespace std;
const int N = 210;
int d[N][N];
int n, m;
int main()
{
memset(d, 0x3f, sizeof d);
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) d[i][i] = 0;
while (m -- )
{
int a, b, c;
cin >> a >> b >> c;
d[a][b] = min(d[a][b], c);
}
for (int k = 1; k <= n; k ++ )
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
if (d[1][n] == 0x3f3f3f3f) puts("-1");
else cout << d[1][n] << endl;
return 0;
}
```
以上就是我对最短路径算法的介绍和实现。
阅读全文