用C++动态规划求多段图的起点到终点的最短路径
时间: 2024-03-05 14:53:09 浏览: 68
动态规划多段图的最短路径问题
以下是用C++动态规划求多段图的起点到终点的最短路径的示例代码:
```cpp
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
// 定义多段图的代价矩阵
const int MAXN = 100;
int matrix[MAXN][MAXN];
// 定义动态规划函数
int shortestPath(int n, int m) {
vector<int> dp(n + 1, INT_MAX);
dp[m] = 0;
for (int i = m + 1; i <= n; ++i) { // 从第m+1段开始遍历
for (int j = m; j < i; ++j) { // 遍历第i段前面的所有段
if (matrix[j][i] != INT_MAX) { // 如果第j段到第i段有路径
dp[i] = min(dp[i], dp[j] + matrix[j][i]); // 更新最短路径
}
}
}
return dp[n];
}
int main() {
int n, m;
cin >> n >> m;
// 处理输入的代价矩阵
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int cost;
cin >> cost;
if (cost == -1) { // 无穷大的情况
matrix[i][j] = INT_MAX;
} else {
matrix[i][j] = cost;
}
}
}
// 输出最短路径
cout << shortestPath(n, m) << endl;
return 0;
}
```
在这个示例代码中,我们使用了一个一维数组dp来记录起点到每个节点的最短路径长度,初始化时将起点m的最短路径长度设为0,其余节点的最短路径长度设为无穷大。然后,从第m+1段开始遍历每个节点,遍历时再从该节点前面的所有段中找到一条到达该节点的最短路径。如果存在这样的路径,则更新该节点的最短路径长度。最终,dp[n]就是起点到终点的最短路径长度。
阅读全文