【动规初步】城市交通

题目描述有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;
}

 



posted @ 2018-10-30 11:25  LizLiz  阅读(211)  评论(0)    收藏  举报