제출 #229868

#제출 시각아이디문제언어결과실행 시간메모리
229868davooddkareshkiCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
775 ms33496 KiB
// be name khoda
#include<bits/stdc++.h>
 
using namespace std;
 
#define F first
#define S second
//#define mp make_pair 
typedef long long ll;
#define int long long
#pragma GCC optimize("Ofast")
 
const int maxn = 2e5+10;
const int mod = 1e9+7;
const ll inf = 1e18+10;
//const int N = 2e6+10;
 
int n, m, k;
int a[maxn], b[maxn], dis[maxn], D[maxn];
int Ss, T, U, V;
vector<pair<int,int>> g[maxn];
vector<int> g2[maxn];

void dijkstra(int s, char tp)
{
   // cout<< s <<" ";
    fill(D,D+maxn,inf);
    set<pair<int,int>> se;
    D[s] = 0;
    se.insert({0,s});

    while(se.size())
    {
        int v = se.begin()->S;
        se.erase({D[v],v});
      //  cout<< v <<" ";
        for(auto e : g[v])
        {
            int u = e.F, w = e.S;
            if(D[v] + w < D[u])
            {
                se.erase({D[u],u});
                D[u] = D[v] + w;
                se.insert({D[u],u});
            }
        }
    }

    if(tp == 'S')
        for(int i = 1; i <= n; i++) dis[i] = D[i];
    if(tp == 'V')
        for(int i = 1; i <= n; i++) a[i] = D[i];
    if(tp == 'U')
        for(int i = 1; i <= n; i++) b[i] = D[i];
}

bool mark[maxn];
int mn[maxn], mn2[maxn];
ll ans = inf;
void dfs(int v)
{
    mn[v] = b[v];
    mn2[v] = a[v];
    mark[v] = 1;
    for(auto u : g2[v])
        if(!mark[u])
        {
            dfs(u);
            mn[v] = min(mn[v],mn[u]);
            mn2[v] = min(mn2[v],mn2[u]);
        }
        else
        {
            mn[v] = min(mn[v],mn[u]);
            mn2[v] = min(mn2[v],mn2[u]);
        }
    ans = min(ans,a[v]+mn[v]);
    ans = min(ans,b[v]+mn2[v]);
    //cout<< v <<" "<< mn[v] <<" "<< mn2[v] <<" "<< a[v] <<" "<< b[v] <<"\n";
}

signed main()
{
   // ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    cin>> n >> m >> Ss >> T >> U >> V;
    //cout<<"SDFg";
    for(int i = 1; i <= m; i++)
    {
        int u, v, w; cin>> u >> v >> w;
   //     cout<< i <<" ";
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
  //  cout<<"SDFG";

    dijkstra(Ss,'S');
    dijkstra(U,'U');
    dijkstra(V,'V');

    for(int v = 1; v <= n; v++)
    {
        for(auto e : g[v])
        {
            int u = e.F, w = e.S;
            if(dis[v] == dis[u] + w)
            {
                g2[v].push_back(u);
               // cout<< u <<" "<< v <<"\n";
            }
        }
        //cout<< a[v] <<" "<< b[v] <<" "<< dis[v] <<"\n";
    }
    dfs(T);
    cout<< min(ans,a[U]);
}

/*
6 6
1 6
1 4
1 2 1
2 3 1
3 5 1
2 4 3
4 5 2
5 6 1

6 5
1 2
3 6
1 2 1000000000
2 3 1000000000
3 4 1000000000
4 5 1000000000
5 6 1000000000

8 8
5 7
6 8
1 2 2
2 3 3
3 4 4
1 4 1
1 5 5
2 6 6
3 7 7
4 8 8

5 5
1 5
2 3
1 2 1
2 3 10
2 4 10
3 5 10
4 5 10

10 15
6 8
7 9
2 7 12
8 10 17
1 3 1
3 8 14
5 7 15
2 3 7
1 10 14
3 6 12
1 5 10
8 9 1
2 9 7
1 4 1
1 8 1
2 4 7
5 6 16
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...