제출 #1346883

#제출 시각아이디문제언어결과실행 시간메모리
1346883bbartekCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
296 ms26884 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll,ll>

const int maxn = 1e5+7;
const ll INF = 1e18;

vector<pll> graf[maxn];
vector<int> dag[maxn];
int wchodzace[maxn];
ll min1[maxn];
ll min2[maxn];

ll odl[maxn][4];

void dijkstra(int x,int nr,int n){
    priority_queue<pll> Q;
    for(int i=1;i<=n;i++){
        odl[i][nr] = INF;
    }
    Q.push({0,x});

    while(Q.size() != 0){
        auto [d,v] = Q.top();
        d = -d;
        Q.pop();
        if(odl[v][nr] != INF)
            continue;

        odl[v][nr] = d;
        for(auto i : graf[v]){
            if(odl[i.st][nr] != INF)
                continue;
            Q.push({-(d+i.nd),i.st});
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n,m,s,t,u,v;

    cin>>n>>m;
    cin>>s>>t;
    cin>>u>>v;
    
    vector<pair<pii,ll>> krawedzie; 
    int a,b,c;
    for(int i=1;i<=m;i++){
        cin>>a>>b>>c;
        graf[a].pb({b,c});
        graf[b].pb({a,c});
        krawedzie.pb({{a,b},c});
    }

    dijkstra(s,0,n);
    dijkstra(t,1,n);
    dijkstra(u,2,n);
    dijkstra(v,3,n);

    ll najkrotsza = odl[t][0], wyn = odl[v][2];
    for(auto [p,d] : krawedzie){
        if(odl[p.st][0] + odl[p.nd][1] + d == najkrotsza){
            dag[p.st].pb(p.nd);
            wchodzace[p.nd]++;
        }
        if(odl[p.st][1] + odl[p.nd][0] + d == najkrotsza){
            dag[p.nd].pb(p.st);
            wchodzace[p.st]++;
        }
    }

    vector<int> topo;
    queue<int> Q;
    for(int i=1;i<=n;i++){
        if(wchodzace[i] == 0)
            Q.push(i);
    }

    while(Q.size() != 0){
        auto x = Q.front();
        Q.pop();
        topo.pb(x);
        for(auto i : dag[x]){
            wchodzace[i]--;
            if(wchodzace[i] == 0)
                Q.push(i);
        }
    }

    reverse(topo.begin(),topo.end());
    for(auto i : topo){
        min1[i] = odl[i][3];
        min2[i] = odl[i][2];
        for(auto j : dag[i]){
            min1[i] = min(min1[i],min1[j]);
            min2[i] = min(min2[i],min2[j]);
        }
        wyn = min(wyn,min1[i] + odl[i][2]);
        wyn = min(wyn,min2[i] + odl[i][3]);
    }

    cout<<wyn<<"\n";
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...