邻接矩阵求最短路径c++
时间: 2023-08-03 16:34:05 浏览: 109
邻接矩阵求最短路径的算法通常使用 Dijkstra 算法或 Floyd 算法。
1. Dijkstra 算法
Dijkstra 算法是一种单源最短路径算法,其基本思想是从源节点开始,不断扩展最短路径,直到到达目标节点为止。具体步骤如下:
(1)初始化:将源节点 s 到所有节点的距离初始化为无穷大,将源节点 s 到自身的距离初始化为 0。
(2)遍历:从源节点 s 开始,按照距离从小到大的顺序遍历所有节点,并更新它们到源节点 s 的距离。
(3)更新:对于当前节点 u 的所有邻居节点 v,如果 u 到源节点 s 的距离加上 u 到 v 的距离小于当前已知的 v 到源节点 s 的距离,则更新 v 的距离。
(4)重复:重复步骤(2)和(3)直到遍历完所有节点或者找到目标节点。
C++ 代码实现:
```c++
const int INF = 0x3f3f3f3f; // 无穷大
int n; // 节点数
int G[MAX][MAX]; // 邻接矩阵
int d[MAX]; // s 到各点的距离
bool vis[MAX]; // 标记是否已确定最短距离
void Dijkstra(int s) {
memset(vis, 0, sizeof(vis));
fill(d, d + n, INF);
d[s] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!vis[j] && (u == -1 || d[j] < d[u])) {
u = j;
}
}
vis[u] = true;
for (int v = 0; v < n; v++) {
if (!vis[v] && G[u][v] != INF && d[u] + G[u][v] < d[v]) {
d[v] = d[u] + G[u][v];
}
}
}
}
```
2. Floyd 算法
Floyd 算法是一种多源最短路径算法,其基本思想是通过中间节点的遍历,不断缩小节点间的距离,直到得到最终的最短路径。具体步骤如下:
(1)初始化:将邻接矩阵 G 初始化为节点间的距离。
(2)遍历:从节点 i 到节点 j 的最短路径可能经过节点 k,因此遍历所有可能的 k 值,更新 i 到 j 的最短路径。
C++ 代码实现:
```c++
const int INF = 0x3f3f3f3f; // 无穷大
int n; // 节点数
int G[MAX][MAX]; // 邻接矩阵
void Floyd() {
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
}
}
}
}
```
阅读全文