1111 Online Map (30 分)难度: 一般 / 知识点: Dijkstra最短路

Posted 辉小歌

tags:

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


https://pintia.cn/problem-sets/994805342720868352/problems/994805358663417856
很传统的最短路,不过要跑两次,其实分开来的话每一问都是比较常规的题目。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int L[N][N],T[N][N],vis[N],dist1[N],dist2[N];
int n,m,st,ed;
vector<int>ans1,ans2,path;
int max_time=1e9,min_cnt=1e9;
void Dijkstra(int g[N][N],int dist[N])

    for(int i=0;i<n;i++) dist[i]=0x3f3f3f3f;
    dist[st]=0;
    memset(vis,0,sizeof vis);
    for(int i=0;i<n;i++)
    
        int t=-1;
        for(int j=0;j<n;j++)
            if(!vis[j]&&(t==-1 || dist[j]<dist[t])) t=j;
        vis[t]=1;
        for(int j=0;j<n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]);
    

void dfs1(int u,int fa,int sum)

    if(u==ed)
    
        if(sum<max_time) max_time=sum,ans1=path;
        return;
    
    for(int i=0;i<n;i++)
    
        if(i==fa) continue;
        if(dist1[i]==dist1[u]+L[u][i])//是对短路上的点
        
            path.push_back(u);
            dfs1(i,u,sum+T[u][i]);
            path.pop_back();
        
    

void dfs2(int u,int fa,int sum)

    if(u==ed)
    
        if(sum<min_cnt) ans2=path,min_cnt=sum;
        return;
    
    for(int i=0;i<n;i++)
    
        if(i==fa) continue;
        if(dist2[i]==dist2[u]+T[u][i])
        
            path.push_back(u);
            dfs2(i,u,sum+1);
            path.pop_back();
        
    

int main(void)

    memset(L,0x3f,sizeof L);
    memset(T,0x3f,sizeof T);
    cin>>n>>m; 
    for(int i=0;i<m;i++)
    
        int a,b,op,l,t; cin>>a>>b>>op>>l>>t;
        if(op)
        
            L[a][b]=min(L[a][b],l);
            T[a][b]=min(T[a][b],t);
        
        else
        
            L[a][b]=min(L[a][b],l);
            L[b][a]=min(L[b][a],l);
            T[a][b]=min(T[a][b],t);
            T[b][a]=min(T[b][a],t);
        
    
    cin>>st>>ed;
    Dijkstra(L,dist1);
    Dijkstra(T,dist2);
    dfs1(st,-1,0);
    dfs2(st,-1,0);
    if(ans1!=ans2)
    
        printf("Distance = %d: ",dist1[ed]);
        for(int i=0;i<ans1.size();i++) cout<<ans1[i]<<" -> ";
        cout<<ed<<endl;
        printf("Time = %d: ",dist2[ed]);
        for(int i=0;i<ans2.size();i++) cout<<ans2[i]<<" -> ";
        cout<<ed<<endl;
    else
    
         printf("Distance = %d; Time = %d: ",dist1[ed],dist2[ed]);
         for(int i=0;i<ans1.size();i++) cout<<ans1[i]<<" -> ";
        cout<<ed<<endl;
    
    return 0;

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

A1111 Online Map (30分)(最短路径Dijkstra+DFS)

PAT_A1111#Online Map

1111. Online Map (30)

PAT (Advanced Level) 1111. Online Map (30)

PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

1111 Online Map