Submission #1268097

#TimeUsernameProblemLanguageResultExecution timeMemory
1268097sean503Commuter Pass (JOI18_commuter_pass)C++20
15 / 100
332 ms27220 KiB
#include<iostream>
#include<vector>
#include<cstdlib> 
#include<string>
#include<algorithm>
#include<set>
#include<math.h>
#include<map>
#include<deque>
#include<unordered_map>
#include<iomanip>
#include<queue>
#include<array>
#include<climits>
#include<cstring>
#include<unordered_set>
#include<cstdint>
#include<typeinfo>
#include <random>
using namespace std;
#define int long long
const int MAX = 999999999999999LL;
struct idk{
    int start,end,cost;
};
vector<vector<pair<int,int>>> adj;
vector<int> len1;
vector<int> len2;
int n,m;
void func(int fx, int ch){
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
    pq.push({0,fx});
    while(!pq.empty()){
        int y = pq.top().first;
        int x = pq.top().second;
        pq.pop();
        if(ch == 1 && len1[x] <= y || ch == 2 && len2[x] <= y){
            continue;
        }
        if(ch == 1){
            len1[x] = y;
        }else{
            len2[x] = y;
        }
        for(int i = 0; i<adj[x].size(); i++){
            pq.push({adj[x][i].second + y,adj[x][i].first});
        }
    }
}
int func2(int cx, int cy){
    priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> pq;
    vector<idk> v(n+1,{MAX,MAX,MAX});
    for(int i = 1; i<=n; i++){
        v[i].start = len1[i];
        v[i].end = len2[i];
    }
    pq.push({0,{cx,0}});
    while(!pq.empty()){
        int node = pq.top().second.first;
        int prev = pq.top().second.second;
        int cost = pq.top().first;
        pq.pop();
        if(v[node].cost < cost){
            continue;
        }
        if(v[node].cost == cost){
            if(v[prev].start + v[node].end > v[node].start + v[node].end){
                continue;
            }
            v[node].start = v[prev].start;
            v[node].end = v[prev].end;
            continue;
        }
        v[node].start = min(v[node].start,v[prev].start);
        v[node].end = min(v[node].end,v[prev].end);
        v[node].cost = cost;
        for(int i = 0; i<adj[node].size(); i++){
            pq.push({cost+adj[node][i].second,{adj[node][i].first,node}});
        }
    }
    return v[cy].start+v[cy].end;
}
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n>>m;
    adj.resize(n+1);
    len1.assign(n+1,MAX);
    len2.assign(n+1,MAX);
    int cx,cy,lx,ly;
    cin>>cx>>cy>>lx>>ly;
    for(int i = 0; i<m; i++){
        int x,y,z;
        cin>>x>>y>>z;
        adj[x].push_back({y,z});
        adj[y].push_back({x,z});
    }
    func(lx,1);
    func(ly,2);
    int ans = len1[ly];
    ans = min(func2(cx,cy),ans);
    ans = min(func2(cy,cx),ans);
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...