最短路问题
题目描述
n个点m条边的有向图,每条边都有边权,边权为经过这条边需要花费的时间,只能从编号小的点走到编号大的点,求从1号点走到n号点所花费最少的时间
思路
这是一道经典动态规划题目,可以分析出只需要考虑到达每个点最短的时间。
然后可以得出一个递推关系式:到达第n个点的最短距离为在所有能够到达第n个点的上一个点的最短距离加上上一个点到第n个点的距离最小,那么就走这一条路。
AC代码
#include <bits/stdc++.h>
const int MX = 1005;
int x[MX][MX], dp[MX];
int main() {
int n, m;
std::cin >> n >> m;
for(int i = 1; i <= m; i++) {
int u, v ,w;
std::cin >> u >> v >> w;
x[v][u] = w;
}
for(int i = 2; i <= n; i++) {
int s = 100000005;
for(int j = 1; j < i; j++) {
if(x[i][j]) {
if(x[i][j] + dp[j] < s) {
s = x[i][j] + dp[j];
}
}
}
dp[i] = s;
}
std::cout << dp[n] << "\n";
}