【动规初步】城市交通
题目描述有n个城市,编号1~n,有些城市之间有路相连,有些则没有,有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市,问你从编号为1的城市到编号为n的城市之间的最短距离是多少?输入先输入一个n,表示城市数,n小于100。
下面的n行是一个n*n的邻接矩阵map[i,j],其中map[i,j]=0表示城市i和城市j之间没有路相连,否则为两者之间的距离。输出
输出格式:一个数,表示最短路径
及路径
样例输入
11 0 5 3 0 0 0 0 0 0 0 0 5 0 0 1 6 3 0 0 0 0 0 3 0 0 0 8 0 4 0 0 0 0 0 1 0 0 0 0 0 5 6 0 0 0 6 8 0 0 0 0 5 0 0 0 0 3 0 0 0 0 0 0 0 8 0 0 0 4 0 0 0 0 0 0 3 0 0 0 0 5 5 0 0 0 0 0 3 0 0 0 6 0 0 0 0 0 0 4 0 0 0 0 0 8 3 0 0 0 3 0 0 0 0 0 0 0 3 4 3 0
样例输出
minlong=13 1 3 7 10 11
#include<bits/stdc++.h> using namespace std; const int inf = 999999999; int n,t; int mapp[102][102]; int f[102],route[102],a[102]; int findr(int k) { if(k != 1) { a[++t] = route[k]; findr(route[k]); } return t; } int main() { cin >> n; int i,j; for(i = 1;i <= n;i++) for(j = 1;j <= n;j++) cin >> mapp[i][j]; for(i = 1;i<= n;i++) f[i] = inf; f[1] = 0; for(j = 1;j <= n;j++) for(i = 1;i <= n;i++) if(mapp[i][j]) { if(f[j] > f[i] + mapp[i][j]) { route[j] = i; f[j] = f[i] + mapp[i][j]; } } cout << "minlong=" << f[n] << endl; a[0] = n; int l = findr(n); for(i = l;i >= 0;i--) cout << a[i] << " " ; return 0; }

浙公网安备 33010602011771号