제출 #1359274

#제출 시각아이디문제언어결과실행 시간메모리
1359274husu1331Commuter Pass (JOI18_commuter_pass)C++20
16 / 100
133 ms18612 KiB
#include <bits/stdc++.h>
using namespace std;
///////////////////////////////////////////////
#define int long long
#define endl "\n"
#define IO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 0x3F3F3F3F3F3F3F3F
#define ss second
#define ff first
#define pb push_back
#define ins insert
#define all(a) a.begin() , a.end()
#define input(a , n) for(int i = 0 ; i < n ; i ++) cin >> a[i]
//#define cin fin
//#define cout fout
///////////////////////////////////////////////
//ofstream fout ("ride.out");
//ifstream fin ("ride.in");
///////////////////////////////////////////////
const int sz = 1e5 + 5 ;
const int LG = 20 ;
const int N = 700 ;
const int mod = 1e9 + 7 ;
const int MAXM = 1e9 + 7 ;
///////////////////////////////////////////////
vector<pair<int , int>>adj[sz] ;
vector<int>dist1(sz , INF) ;
vector<int>dist2(sz , INF) ;
vector<int>dist3(sz , INF) ;
void dijikstra1(int node) {
  dist1[node] = 0 ;
  priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
  pq.push({0, node});
  while(!pq.empty()) {
    int dis = pq.top().ff ;
    int u = pq.top().ss ;
    pq.pop();
    if(dis <= dist1[u]) {
        for(auto edge : adj[u]) {
        int v = edge.ff ;
        int weight = edge.ss ;
        if (dist1[u] + weight < dist1[v]) {
          dist1[v] = dist1[u] + weight ;
          pq.push({dist1[v] , v});
        }
      }
    }
  }
}
void dijikstra2(int node) {
  dist2[node] = 0 ;
  priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
  pq.push({0 , node});
  while(!pq.empty()) {
    int dis = pq.top().ff;
    int u = pq.top().ss;
    pq.pop() ;
    if(dis <= dist2[u]) {
      for(auto edge : adj[u]) {
        int v = edge.ff;
        int weight = edge.ss;
        if (dist2[u] + weight < dist2[v]) {
          dist2[v] = dist2[u] + weight;
          pq.push({dist2[v], v});
        }
      }
    }
  }
}
void dijikstra3(int node) {
  dist3[node] = 0 ;
  priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
  pq.push({0, node});
  while(!pq.empty()) {
    int dis = pq.top().ff ;
    int u = pq.top().ss ;
    pq.pop();
    if(dis <= dist3[u]) {
        for(auto edge : adj[u]) {
        int v = edge.ff ;
        int weight = edge.ss ;
        if (dist3[u] + weight < dist3[v]) {
          dist3[v] = dist3[u] + weight ;
          pq.push({dist3[v] , v});
        }
      }
    }
  }
}
///////////////////////////////////////////////
void solve() {
  int n ;
  cin >> n ;
  int m ;
  cin >> m ;
  int s ;
  cin >> s ;
  int t ; 
  cin >> t ;
  int u ;
  cin >> u ;
  int v ;
  cin >> v ;
  for(int i = 0 ; i < m ; i ++) {
    int x , y ;
    cin >> x >> y ;
    int w ;
    cin >> w ;
    adj[x].push_back({y , w}) ;
    adj[y].push_back({x , w}) ;
  }
  dijikstra1(s) ;
  dijikstra2(v) ;
  dijikstra3(t) ;
  int ans = INF ;
  for(int i = 1 ; i <= n ; i ++) {
    if(dist1[i] + dist3[i] == dist3[s]) ans = min(ans , dist2[i]) ;
  }
  cout << ans ;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
signed main() {
  //freopen("mootube.in", "r", stdin);
  //freopen("mootube.out", "w", stdout);
  //sufcompute() ;
  IO ;
  int t = 1 ; // cin >> t ;
  while(t --) {
    solve() ;
    cout << endl ;
  }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…