1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392
先跑一下Dijkstra()
然后再dfs()一下求最短路下的最小花费即可,记得保存路径。

#include<bits/stdc++.h>
using namespace std;
const int N=1e2*5+10;
const int inf=0x3f3f3f3f;
int dist[N],g[N][N],price[N][N],n,m,s,d;
int st[N],ans=inf;
vector<int>paths,temp;
void Dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    dist[s]=0;
    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=0;j<n;j++) if(!st[j]&&(t==-1 || dist[j]<dist[t])) t=j;
        st[t]=1;
        for(int j=0;j<n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
}
void dfs(int u,int father,int sum)
{
    if(u==d)
    {
        if(sum<ans) 
        {
            ans=sum,paths=temp;
            paths.push_back(d);
        }
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(i==father) continue;//避免走回路
        if(dist[i]==dist[u]+g[u][i])//是最短路上的点
        {
            temp.push_back(u);
            dfs(i,u,sum+price[u][i]);
            temp.pop_back();
        }
    }
}
int main(void)
{
    cin>>n>>m>>s>>d;
    memset(g,0x3f,sizeof g);
    memset(price,0x3f,sizeof price);
    for(int i=0;i<m;i++)
    {
        int a,b,c,w; cin>>a>>b>>c>>w;
        if(g[a][b]>c)
        {
            g[a][b]=g[b][a]=c;
            price[a][b]=price[b][a]=w;
        }
    }
    Dijkstra();
    dfs(s,-1,0);
    for(int i=0;i<paths.size();i++) cout<<paths[i]<<" ";
    cout<<dist[d]<<" "<<ans;
    return 0;
}

以上是关于1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路的主要内容,如果未能解决你的问题,请参考以下文章

1030 Travel Plan (30 分)

1030 Travel Plan (30)(30 分)

1030 Travel Plan (30分)

A1030 Travel Plan (30分)

1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路

1030 Travel Plan (30 分)(最短路径 and dfs)