时间限制: 1000 ms 内存限制: 65536 KB
提交数: 5585 通过数: 4006
【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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 <iostream>
#include <cstring>
#include <deque>
#include <stack>
#define N 128
using namespace std;

int GN,dis[N],pos[N];
int n;

bool ved[N];

inline void init()
{
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            cin>>Gi;
            if(Gi==0)
                Gi=0x3f3f3f3f;
        }
    memset(dis,0x3f,sizeof(dis));
}

inline void Spfa()
{
    deque <int> Q;
    Q.push_front(1);
    ved[1]=true;
    dis[1]=0;
    while(!Q.empty())
    {
        int k=Q.front();
        Q.pop_front();
        ved[k]=false;
        
        
        for(int i=1;i<=n;i++)
            if(dis[i]>dis[k]+Gk)
            {
                dis[i]=dis[k]+Gk;
                pos[i]=k;
                if(!ved[i])
                {
                    if(!Q.empty() && dis[i]<dis[Q.front()])
                        Q.push_front(i);
                    else
                        Q.push_back(i);
                    ved[i]=true;
                }
            }
    }
}

stack <int> path;

int calc(int k)
{
    path.push(k);
    if(pos[k]!=0)
        calc(pos[k]);
    else
    {
        while(!path.empty())
        {
            cout<<path.top()<<' ';
            path.pop();
        }
    }
}

int main()
{
    init();
    Spfa();
    cout<<"minlong="<<dis[n]<<endl;
    calc(n);
}
Last modification:February 19th, 2021 at 09:35 pm