提出 #12957622


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define INF 2100000000
#define LLINF 10000000000000000ll
#define MOD 1000000007

bool dbgflag =false; //debug

struct edge {
  int cost;
  int to;
};


const int MAX_N = 5000;
int n;
vector<edge> graph[MAX_N];
int d[MAX_N];

void dijkstra(int s) {
  fill(d, d+n, INF);
  priority_queue<pll, vector<pll>, greater<pll>> que;

  d[s] = 0;
  que.push(pll(0, s));

  while(!que.empty()) {
    pll p = que.top();
    que.pop();
    ll v = p.second;

    if (d[v] < p.first) continue;

    for (edge e: graph[v]) {
      if (d[e.to] <= d[v] + e.cost) continue;
      d[e.to] = d[v] + e.cost;
      que.push(pll(d[e.to], e.to));
    }
  }
  return;
}


int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int k;
  cin >> n >> k;
  vector<pii> taxi(n);
  for (int i = 0; i < n; i++) {
    int c, r;
    cin >> c >> r;
    taxi[i] = pii(c, r);
  }

  vector<edge> taxiGraph[MAX_N];
  for (int i = 0; i < k; i++) {
    int a, b;
    cin >> a >> b;
    a--; b--;
    edge e1, e2;
    e1.to = a; e1.cost = INF;
    e2.to = b; e2.cost = INF;
    taxiGraph[a].push_back(e2);
    taxiGraph[b].push_back(e1);
  }
  
  vector<vector<int>> roads(n, vector<int>(n,-1));
  for (int j = 0; j < n; j++) {
    queue<int> que;
    roads[j][j] = 0;
    que.push(j);
    while (!que.empty()) {
      int q = que.front();
      que.pop();
      for (int i = 0; i < taxiGraph[q].size(); i++) {
        int next_q = taxiGraph[q][i].to;
        if (roads[j][next_q] != -1) continue;
        roads[j][next_q] = roads[j][q] + 1;
        que.push(next_q);
      }
    }
  }

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if ((roads[i][j] <= taxi[i].second) && (i != j)) {
        edge e;
        e.cost = taxi[i].first; e.to = j;
        graph[i].push_back(e);
      }
    }
  }
  if (dbgflag) {
    for (int i = 0; i < n; i++) {
      cout << "i: " << i << endl;
      for (edge e: graph[i]) cout << e.to << " " << e.cost << endl;
    }
  }

  dijkstra(0);

  cout << d[n-1] << endl;
}

提出情報

提出日時
問題 E - タクシー (Taxis)
ユーザ waidaa
言語 C++14 (GCC 5.4.1)
得点 100
コード長 2251 Byte
結果 AC
実行時間 1305 ms
メモリ 223228 KiB

ジャッジ結果

セット名 set01 set02 set03 set04 set05
得点 / 配点 20 / 20 20 / 20 20 / 20 20 / 20 20 / 20
結果
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
セット名 テストケース
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
ケース名 結果 実行時間 メモリ
data1 AC 2 ms 512 KiB
data2 AC 2 ms 512 KiB
data3 AC 21 ms 4608 KiB
data4 AC 866 ms 98816 KiB
data5 AC 1305 ms 223228 KiB