제출 #167422

#제출 시각아이디문제언어결과실행 시간메모리
167422cbertramCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
435 ms26960 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<pll> vpll;
typedef vector<vpll> vvpll;
typedef vector<string> vs;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
#define all(x) x.begin(), x.end()
#define rep(i,a,b) for(int i = a; i < b; i++)

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int N, M;
  cin >> N;
  cin >> M;
  int S, T;
  cin >> S;
  cin >> T;
  S--;
  T--;
  int U, V;
  cin >> U;
  cin >> V;
  U--;
  V--;

  vvpll conn(N, vpll(0));
  rep(m,0,M) {
    long a, b, c;
    cin >> a;
    cin >> b;
    cin >> c;
    a--;
    b--;
    conn[a].push_back(make_pair(b, c));
    conn[b].push_back(make_pair(a, c));
  }

  vll distU(N);
  vb vis(N);
  priority_queue<pll, vpll, greater<pll>> pq1;
  pq1.push(make_pair(0,U));
  while(!pq1.empty()) {
    ll n = pq1.top().second;
    ll d = pq1.top().first;
    pq1.pop();
    if(vis[n]) continue;
    vis[n] = true;
    distU[n] = d;
    rep(i,0,(int)conn[n].size())
      if(!vis[conn[n][i].first])
	pq1.push(make_pair(d+conn[n][i].second, conn[n][i].first));
  }
  vll distV(N);
  fill(all(vis), false);
  pq1.push(make_pair(0,V));
  while(!pq1.empty()) {
    ll n = pq1.top().second;
    ll d = pq1.top().first;
    pq1.pop();
    if(vis[n]) continue;
    vis[n] = true;
    distV[n] = d;
    rep(i,0,(int)conn[n].size())
      if(!vis[conn[n][i].first])
	pq1.push(make_pair(d+conn[n][i].second, conn[n][i].first));
  }
  //rep(n,0,N) cerr << distV[n] << ' ';
  //cerr << '\n';

  fill(all(vis), false);
  priority_queue<pair<pair<ll,pair<ll,pair<ll,ll>>>,ll>,
		 vector<pair<pair<ll,pair<ll,pair<ll,ll>>>,ll>>,
		 greater<pair<pair<ll,pair<ll,pair<ll,ll>>>,ll>>> pq;
  pq.push(make_pair(make_pair(0,make_pair(distU[S]+distV[S],make_pair(distU[S],distV[S]))),S));
  while(!pq.empty()) {
    ll dS = pq.top().first.first;
    ll dUV = pq.top().first.second.first;
    ll dU = pq.top().first.second.second.first;
    ll dV = pq.top().first.second.second.second;
    ll n = pq.top().second;
    pq.pop();
    //cerr << "n?: " << n << '\n';
    if(vis[n]) continue;
    vis[n] = true;
    //cerr << "n: " << n << '\n';
    if(n == T) {
      //cout << dUV << ", " << dU << ", " << dV << ", " << dS << '\n';
      cout << min(distU[V], dUV) << '\n';
      break;
    }
    rep(i,0,(int)conn[n].size())
      if(!vis[conn[n][i].first]) {
	ll nn = conn[n][i].first;
	ll ndS = dS+conn[n][i].second;
	ll ndU = min(dU, distU[nn]);
	ll ndV = min(dV, distV[nn]);
	ll ndUV = ndU+ndV;
	pq.push(make_pair(make_pair(ndS,make_pair(ndUV,make_pair(ndU,ndV))),nn));
      }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...