信息奥赛一本通【例9.5】城市交通路网 (1261) 题解
时间限制: 1000 ms
内存限制: 65536 KB
题目描述
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
如图:求v1到v10的最短路径长度及最短路径。
输入
第一行为城市的数量N;
后面是N*N的表示两个城市间费用组成的矩阵。
输出
A->E的最省费用。
输入样例
10
0 2 5 1 0 0 0 0 0 0
0 0 0 0 12 14 0 0 0 0
0 0 0 0 6 10 4 0 0 0
0 0 0 0 13 12 11 0 0 0
0 0 0 0 0 0 0 3 9 0
0 0 0 0 0 0 0 6 5 0
0 0 0 0 0 0 0 0 10 0
0 0 0 0 0 0 0 0 0 5
0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0
输出样例
minlong=19
1 3 5 8 10
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m[1024][1024], vis[1024], p[1024];
int dp(int x) {
if(x >= n) return 0;
if(vis[x] != -1) return vis[x];
for(int i = 1; i <= n; i++) {
if(m[x][i] && (vis[x] == -1 || vis[x] > m[x][i] + dp(i))) {
vis[x] = m[x][i] + dp(i);
p[x] = i;
}
}
return vis[x];
}
void print(int x) {
printf("%d ", x);
if(x == n) return;
print(p[x]);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &m[i][j]);
memset(vis, -1, sizeof(vis));
printf("minlong=%d\n", dp(1));
print(1);
return 0;
}