結果

問題 No.848 なかよし旅行
ユーザー YamaKasa
提出日時 2019-07-13 00:34:53
言語 C++14
(gcc 8.3.0)
結果
AC  
実行時間 151 ms
コード長 2,148 Byte
コンパイル時間 1,433 ms
使用メモリ 7,728 KB
最終ジャッジ日時 2019-10-05 20:46:31

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
in01.txt AC 3 ms
1,520 KB
in02.txt AC 2 ms
1,528 KB
in03.txt AC 3 ms
1,528 KB
in04.txt AC 3 ms
1,532 KB
in05.txt AC 4 ms
1,560 KB
in06.txt AC 4 ms
1,532 KB
in07.txt AC 5 ms
1,584 KB
in08.txt AC 4 ms
1,676 KB
in09.txt AC 5 ms
1,604 KB
in10.txt AC 44 ms
3,744 KB
in11.txt AC 61 ms
4,308 KB
in12.txt AC 81 ms
5,472 KB
in13.txt AC 23 ms
2,356 KB
in14.txt AC 77 ms
5,300 KB
in15.txt AC 135 ms
7,728 KB
in16.txt AC 99 ms
6,204 KB
in17.txt AC 46 ms
3,548 KB
in18.txt AC 38 ms
3,048 KB
in19.txt AC 7 ms
1,792 KB
in20.txt AC 116 ms
6,584 KB
in21.txt AC 131 ms
6,984 KB
in22.txt AC 25 ms
1,772 KB
in23.txt AC 3 ms
1,524 KB
in24.txt AC 151 ms
7,716 KB
sample01.txt AC 3 ms
1,520 KB
sample02.txt AC 3 ms
1,520 KB
sample03.txt AC 3 ms
1,508 KB
sample04.txt AC 3 ms
1,524 KB
テストケース一括ダウンロード

ソースコード

diff #
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N, M, P, Q, T;
static const ll INF = 100000000000000;
 
struct Node {
  int id;
  ll cost;
  Node() {}
  Node(int id, ll cost) : id(id), cost(cost){}
  bool operator< (const Node& node) const {
    return node.cost < cost;
  } 
};

// N: 頂点数, E: 辺の数, d: 距離 を格納する配列, 
// t: 始点, flag: true なら 無向辺, false なら 有向辺
void dijkstra(int N, int E, ll d[], int t, int from[], int to[], ll cost[], bool flag) {
  static const int WHITE = 0;
  static const int GRAY = 1;
  static const int BLACK = 2;
  
  int color[N];
  vector<Node> adj[N];
  for (int i = 0; i < N; i++) {
    d[i] = INF;
    color[i] = WHITE;
  }
  // 隣接リストの作成
  for (int i = 0; i < E; i++) {
    adj[from[i]].push_back(Node(to[i], cost[i]));
    if (flag) adj[to[i]].push_back(Node(from[i], cost[i]));
  }
  priority_queue<Node> pq;
  d[t] = 0;
  pq.push(Node(t, 0));
  while (!pq.empty()) {
    Node f = pq.top();
    pq.pop();
    int u = f.id;
    color[u] = BLACK;
    if (d[u] < f.cost) continue;
    for (int j = 0; j < adj[u].size(); j++) {
      int v = adj[u][j].id;
      if (color[v] == BLACK) continue;
      if (d[v] > d[u] + adj[u][j].cost) {
        d[v] = d[u] + adj[u][j].cost;
        pq.push(Node(v, d[v]));
        color[v] = GRAY;
      }
    }
  }
}

int main() {
  
  cin >> N >> M >> P >> Q >> T;
  int a[M], b[M];
  ll c[M];
  for (int i = 0; i < M; i++) {
    cin >> a[i] >> b[i] >> c[i];
    a[i]--;
    b[i]--;
  }
  P--;
  Q--;
  ll d[N], dP[N], dQ[N];
  dijkstra(N, M, d, 0, a, b, c, true);
  dijkstra(N, M, dP, P, a, b, c, true);
  dijkstra(N, M, dQ, Q, a, b, c, true);

  if (d[P] * 2 > T || d[Q] * 2 > T) {
    cout << "-1\n";
    return 0;
  }
  if (d[P] + dP[Q] + dQ[0] <= T) {
    cout << T << "\n";
    return 0;
  }
  ll ans = 0;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      if (d[i] + dP[i] + dP[j] + d[j] > T) continue;
      if (d[i] + dQ[i] + dQ[j] + d[j] > T) continue;
      ans = max(ans, T - max(dP[i] + dP[j], dQ[i] + dQ[j]));
    }
  }
  cout << ans << "\n";
  return 0;
}
0