제출 #74553

#제출 시각아이디문제언어결과실행 시간메모리
74553garyyeCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
401 ms87376 KiB
// author: gary
// created: 2018/09/03 13:29:03
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <limits>
#include <utility>
#include <functional>
#include <string>
#include <bitset>
#include <deque>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
#define SZ(x) ( (int) (x).size() )
#define ALL(c) (c).begin(), (c).end()
#define CNT(c, x) ((c).find(x) != (c).end())
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
template<class T> bool cmax(T& a, T b) { if(a < b) { a = b; return true; } return false; }
template<class T> bool cmin(T& a, T b) { if(a > b) { a = b; return true; } return false; }

const int INF = 1e9;
const int N = 100005;

int n, m, S, T, U, V;

vector<pii> E[N];

ll d[2][N]; // d[U][.] and d[V][.]

void dijkstra(ll* dist, int u) {
  priority_queue<pli, vector<pli>, greater<pli>> pq;
  fill(dist, dist + N, 1LL<<62);
  dist[u] = 0;
  pq.push(mp(0, u));
  while(!pq.empty()) {
    pli t = pq.top();
    pq.pop();
    if(dist[t.second] < t.first) {
      continue;
    }
    for(auto& e: E[t.second]) {
      if(cmin(dist[e.first], t.first + e.second)) {
        pq.push(mp(dist[e.first], e.first));
      }
    }
  }
}

ll dist[N];
ll min_d[2][N];
ll min_sum[N];

ll calc(int U, int V) {
  priority_queue<pli, vector<pli>, greater<pli>> pq;
  fill(dist, dist + N, 1LL<<62);
  fill(min_sum, min_sum + N, 1LL<<62);
  for(int i = 1; i <= n; i++) {
    min_sum[i] = 1LL<<62;
    min_d[0][i] = min_d[1][i] = 1LL<<62;
  }
  dist[U] = 0;
  min_sum[U] = d[0][U] + d[1][U];
  min_d[0][U] = d[0][U];
  min_d[1][U] = d[1][U];

  pq.push(mp(0LL, U));
  while(!pq.empty()) {
    pli t = pq.top();
    pq.pop();
    int u = t.second;
    ll cost = t.first;
    if(dist[u] < cost) {
      continue;
    }
    for(auto& e: E[u]) {
      int v = e.first;
      ll ndist = cost + e.second;
      
      if(dist[v] < ndist) {
        continue;
      }
      if(dist[v] > ndist) {
        for(int i = 0; i < 2; i++) {
          min_d[i][v] = d[i][v];
        }
        min_sum[v] = 1LL << 62;
        dist[v] = ndist;
        pq.push(mp(dist[v], v));
      }
      for(int i = 0; i < 2; i++) {
        cmin(min_d[i][v], min_d[i][u]);
      }

      cmin(min_sum[v], min_d[0][v] + d[1][v]);
      cmin(min_sum[v], min_d[1][v] + d[0][v]);

      cmin(min_sum[v], min_sum[u]);
    }
  }
  /*
  for(int i = 1; i <= n; i++) {
    printf("min_sum: %d %lld\n", i, min_sum[i]);
  }
  */
  return min_sum[V];
}

int main() {
  cin >> n >> m >> S >> T >> U >> V;
  for(int i = 0; i < m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    E[u].emplace_back(v, w);
    E[v].emplace_back(u, w);
  }

  dijkstra(d[0], U);
  dijkstra(d[1], V);
  // for(int i = 1; i <= n; i++) { printf("%lld %lld\n", d[0][i], d[1][i]); }
  printf("%lld\n", min(d[0][V], calc(S, T)));
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:128:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d", &u, &v, &w);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...