Submission #956467

#TimeUsernameProblemLanguageResultExecution timeMemory
956467doducanhCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
460 ms33916 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ii pair<int,int>
#define ip pair<int,ii>
#define fi first
#define se second
const int maxn=1e5+7;
const int inf=1e15+7;
int vst[maxn];
int du[maxn];
int dv[maxn];
int ds[maxn];
int n,m,s,t,u,v;
int ans;
vector<ii>a[maxn];
int d[2][maxn];
void dijkstra1(int start,int arr[])
{
    for(int i=1;i<=n;i++){vst[i]=0;arr[i]=inf;}
    priority_queue<ii,vector<ii>,greater<ii>>q;
    arr[start]=0;
    q.push({0,start});
    while(q.size()){
        int u=q.top().se;
        int du=q.top().fi;
        q.pop();
        if(vst[u])continue;
        vst[u]=1;
        for(ii p:a[u]){
            int v=p.fi;
            int w=p.se;
            if(arr[v]>arr[u]+w){
                arr[v]=arr[u]+w;
                q.push({arr[v],v});
            }
        }
    }
}
void dijkstra2(int start,int endd)
{

    for(int i=0;i<=n;i++){
        d[0][i]=inf;
        d[1][i]=inf;
        ds[i]=inf;
        vst[i]=0;
    }
    ds[start]=0;
    priority_queue<ip,vector<ip>,greater<ip>>q;
    q.push(make_pair(0,make_pair(start,0)));
    while(q.size()){
        int node=q.top().se.fi;
        int par=q.top().se.se;
        int dnode=q.top().fi;
        q.pop();
        if(vst[node]==0){
            vst[node]=1;
            d[0][node]=min(du[node],d[0][par]);
            d[1][node]=min(dv[node],d[1][par]);
            ds[node]=dnode;
            for(ii p:a[node]){
                int v=p.fi;
                int w=p.se;
                q.push(make_pair(dnode+w,make_pair(v,node)));
            }
        }
        else if(dnode==ds[node]){
            if(min(du[node],d[0][par])+min(dv[node],d[1][par])<=d[0][node]+d[1][node])
            {
                d[0][node]=min(d[0][par],du[node]);
                d[1][node]=min(d[1][par],dv[node]);
            }
        }

    }
    ans=min(ans,d[0][endd]+d[1][endd]);
}
main()
{
    cin>>n>>m;
    cin>>s>>t;
    cin>>u>>v;
    for(int i=1;i<=m;i++){
        int x,y,w;
        cin>>x>>y>>w;
        a[x].push_back({y,w});
        a[y].push_back({x,w});
    }
    dijkstra1(u,du);
    dijkstra1(v,dv);
    ans=du[v];
    dijkstra2(s,t);
    dijkstra2(t,s);
    cout<<ans;
    return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void dijkstra1(long long int, long long int*)':
commuter_pass.cpp:27:13: warning: unused variable 'du' [-Wunused-variable]
   27 |         int du=q.top().fi;
      |             ^~
commuter_pass.cpp: At global scope:
commuter_pass.cpp:80:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   80 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...