Submission #642356

#TimeUsernameProblemLanguageResultExecution timeMemory
642356PoonYaPatCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
357 ms25060 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
typedef tuple<ll,int,int,ll> tu;

ll disS[100001],disT[100001],disU[100001],disV[100001],dis[100001];
vector<pii> adj[100001];
int n,m,s,t,u,v;

bool check(int x, int y, ll val) { //check if x and y are on the same shortest path
    return min(disS[x]+disT[y],disS[y]+disT[x])!=disS[t]-val;
}

void dij(int start, ll *dis) {
    for (int i=1; i<=n; ++i) dis[i]=1e18;
    bool vis[100001]; memset(vis,0,sizeof(vis));
    priority_queue<pii, vector<pii>, greater<pii>> q;

    dis[start]=0;
    q.push(pii(0,start));

    while (!q.empty()) {
        ll node=q.top().second;
        q.pop();

        if (vis[node]) continue;
        vis[node]=true;

        for (auto s : adj[node]) {
            ll des=s.first, w=s.second;
            if (dis[des]>dis[node]+w) {
                dis[des]=dis[node]+w;
                q.push(pii(dis[des],des));
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m>>s>>t>>u>>v;
    for (int i=0; i<m; ++i) {
        int a,b,w;
        cin>>a>>b>>w;
        adj[a].push_back(pii(b,w));
        adj[b].push_back(pii(a,w));
    }
    dij(s,disS);
    dij(t,disT);
    dij(v,disV);

    priority_queue<tu, vector<tu>, greater<tu>> q;
    bool vis[100001]; memset(vis,0,sizeof(vis));

    ll ans=LLONG_MAX;
    for (int i=1; i<=n; ++i) disU[i]=1e18;

    disU[u]=0;
    q.push(tu(0,u,u,0));
    int ans_node;

    while (!q.empty()) {
        int pre=get<1>(q.top()),now=get<2>(q.top()),dis=get<3>(q.top());
        q.pop();

        if (vis[now]) continue;
        vis[now]=true;

        ans=min(ans,disU[now]+disV[now]);

        for (auto s : adj[now]) {
            ll des=s.first, w=s.second;
            if (disS[pre]+disT[pre]==disS[t]) {
                if (disU[des]>disU[now]+w*check(pre,des,dis+w)) {
                    disU[des]=disU[now]+w*check(pre,des,dis+w);
                    q.push(tu(disU[des],now,des,w));
                }
            } else {
                if (disU[des]>disU[now]+w*check(now,des,w)) {
                    disU[des]=disU[now]+w*check(now,des,w);
                    q.push(tu(disU[des],now,des,w));
                }
            }

        }
    }
    cout<<ans;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:61:9: warning: unused variable 'ans_node' [-Wunused-variable]
   61 |     int ans_node;
      |         ^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...