编写一个C++程序,要求:利用动态规划法来求解从顶点0到顶点12的最短路径
时间: 2023-06-19 08:08:19 浏览: 76
以下是一个使用动态规划法求解最短路径的C++程序实现:
```cpp
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max(); // 无穷大
int main() {
// 邻接矩阵表示有向带权图
vector<vector<int>> graph = {
{0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF},
{INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF},
{INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF},
{INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF},
{INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF},
{INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF},
{INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF},
{INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF},
{INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF},
{INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF},
{INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF},
{INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1},
{INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0}
};
// 动态规划求解最短路径
int n = graph.size();
vector<int> dist(n, INF);
dist[0] = 0; // 起点到自身的距离为0
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (graph[j][i] != INF) { // 存在一条从j到i的边
dist[i] = min(dist[i], dist[j] + graph[j][i]);
}
}
}
// 输出结果
cout << "0到12的最短路径长度为:" << dist[12] << endl;
return 0;
}
```
这个程序使用了邻接矩阵来表示有向带权图,其中INF表示两个顶点之间不存在边。动态规划求解最短路径的核心代码在第13-18行,其中dist[i]表示顶点0到顶点i的最短路径长度。最后输出dist[12]即为顶点0到顶点12的最短路径长度。