目录
题目看完,发现竟是一个关于有向无环图的题!
把输入样例看完,又发现题目用邻接表存储!
选做法
这题可以用DFS逐一试探,记录最小值
这里我们就不写这种方法了,应该会超时
为啥会超时呢?
我们来写一下DFS访问的路径:
1 2 5 8 10
1 2 5 9 10
......
1 3 5 8 10
1 3 5 9 10
......
1 4 5 8 10
1 4 5 9 10
......
我们发现调用了重复的函数,总是出现 5 8 10 5 9 10 对吧
这里我们改进成一下,用动态规划做
状态设置和转移
状态设置
dp[i] v1 -> vi 的最短路径和
状态转移
dp[i] 可以由能够到达i的点转移过来
for (k : 1 -> n) {
if (a[k][i]) dp[i] <- dp[k]
先解决第一个问题
求最短路径
代码是这样的:
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
scanf ("%d", &a[i][j]);
dp[1] = 0;
for (int i = 2; i <= n; i ++) {
dp[i] = 2e9;
for (int j = 1; j <= n; j ++)
if (a[j][i])
dp[i] = min(dp[i], dp[j] + a[j][i]);
}
printf ("minlong=%d\n", dp[n]);
输出路径
我们记录一下每个节点的前驱,再用递归输出
void print(int x) {
if (x == -1)
return ;
print(pre[x]);
printf ("%d ", x);
}
另外,我们初始化和访问图是也要加一点东西, 求最短路径就变成这样
dp[1] = 0, pre[1] = -1;
for (int i = 2; i <= n; i ++) {
dp[i] = 2e9;
for (int j = 1; j <= n; j ++) {
if (a[j][i] && dp[i] > dp[j] + a[j][i]) {
dp[i] = dp[j] + a[j][i];
pre[i] = j;
}
}
}
输入输出
输入:
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
scanf ("%d", &a[i][j]);
输出:
printf ("minlong=%d\n", dp[n]);
具体代码(最后代码)
最后提交的代码是这样的:
//【例9.5】城市交通路网
#include <iostream>
using namespace std;
const int N = 1005;
int a[N][N], dp[N], pre[N], n;
void print(int x) {
if (x == -1)
return ;
print(pre[x]);
printf ("%d ", x);
}
int main() {
/*
状态设置
dp[i] v1 -> vi 的最短路径和
状态转移
dp[i] 可以由能够到达i的点转移过来
for (k : 1 -> n) {
if (a[k][i]) dp[i] <- dp[k]
*/
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
scanf ("%d", &a[i][j]);
dp[1] = 0, pre[1] = -1;
for (int i = 2; i <= n; i ++) {
dp[i] = 2e9;
for (int j = 1; j <= n; j ++) {
if (a[j][i] && dp[i] > dp[j] + a[j][i]) {
dp[i] = dp[j] + a[j][i];
pre[i] = j;
}
}
}
printf ("minlong=%d\n", dp[n]);
print(n);
return 0;
}
/*
【输入样例】
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
*/
原题链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
请勿转载,创作不易,留个赞再走吧(●'◡'●)