Submission #1065616

#TimeUsernameProblemLanguageResultExecution timeMemory
1065616vjudge1Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
214 ms30636 KiB


#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define for1(i,j,k) for(int i=(j);i<=(k);i++)
#define for2(i,j,k) for(int i=(j);i>=(k);i--)
#define for3(i,j,k,l) for(int i=j;i<=k;i+=l)
#define bit(n,i) ((n>>i)&1)
#define all(x) x.begin(),x.end()
#pragma GCC optimize("O2,unroll-loops")
#pragma GCC target("avx,avx2,bmi,bmi2,sse,sse2,sse3,ssse3,sse4,popcnt")
#define int long long
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
typedef pair<ld,ld> pdd;
typedef pair<ll,ll> pll;
const ll maxn=2e5+6;
const ll offset=1e9;
const ll block_sz=317;
const ll inf=1e18;
const ll mod=123456789;

int n,m,q;
int A,B,C,D,bac[maxn],preC[maxn],preD[maxn];
vector<int> disC,disD,disA,disB;
vector<pii>adj[maxn];
vector<int> ke[maxn];

priority_queue<pii,vector<pii>,greater<pii>> pq;
void dijkstra(int u,vector<int>& dis)
{
    dis.resize(n+1,inf);
    dis[u]=0;
    pq.push({0,u});
    while (!pq.empty())
    {
        int u=pq.top().se,_=pq.top().fi;
        pq.pop();
        if (_!=dis[u]) continue;
        for(auto [v,w]: adj[u])
        {
            if (dis[u]+w<dis[v])
            {
                dis[v]=dis[u]+w;
                pq.push({dis[v],v});
            }
        }
    }
}
inline bool chk(int u) {return ((disA[u]+disB[u])==disA[B]);}
void sol()
{
    cin >> n>> m>> A>>B>>C>>D;
    for1(i,1,m)
    {
        int u,v,w; cin >> u>> v>>w;
        adj[u].pb({v,w});
        adj[v].pb({u,w});
    }
    dijkstra(A,disA);
    dijkstra(B,disB);
    dijkstra(C,disC);
    dijkstra(D,disD);
    for1(u,1,n)
    {
        if (chk(u))
        {
            for (auto [v,w]: adj[u])
            {
                if (chk(v) && disA[v]==disA[u]+w)
                {
                    ke[u].pb(v);
                    bac[v]++;
                }
            }
        }
    }
    for1(i,1,n)
    {
        preC[i]=disC[i];
        preD[i]=disD[i];
    }
    int res=disC[D];
    vector<int> L;
    L.pb(1);
    while (!L.empty())
    {
        int u=L.back();
        L.pop_back();
        res=min(res,min(preC[u]+disD[u],preD[u]+disC[u]));
        for(int v: ke[u])
        {
            preC[v]=min(preC[v],preC[u]);
            preD[v]=min(preD[v],preD[u]);
            bac[v]--;
            if (bac[v]==0)
            {
                L.pb(v);
            }
        }
    }
    cout << res;

}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
//    freopen("PAINT.inp","r",stdin);
//    freopen("PAINT.out","w",stdout);
    int t=1;//cin>>t;
    while (t--)
    {
        sol();
    }
}
/*
*/



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...