結果

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

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
in01.txt AC 2 ms
1,512 KB
in02.txt AC 3 ms
1,512 KB
in03.txt AC 3 ms
1,516 KB
in04.txt AC 2 ms
1,520 KB
in05.txt AC 3 ms
1,548 KB
in06.txt AC 2 ms
1,516 KB
in07.txt AC 4 ms
1,580 KB
in08.txt AC 5 ms
1,664 KB
in09.txt AC 4 ms
1,592 KB
in10.txt AC 45 ms
3,736 KB
in11.txt AC 61 ms
4,300 KB
in12.txt AC 85 ms
5,460 KB
in13.txt AC 23 ms
2,360 KB
in14.txt AC 78 ms
5,296 KB
in15.txt AC 139 ms
7,728 KB
in16.txt AC 114 ms
6,192 KB
in17.txt AC 51 ms
3,536 KB
in18.txt AC 49 ms
3,048 KB
in19.txt AC 8 ms
1,776 KB
in20.txt AC 121 ms
6,576 KB
in21.txt AC 136 ms
6,976 KB
in22.txt AC 24 ms
1,764 KB
in23.txt AC 3 ms
1,512 KB
in24.txt AC 157 ms
7,716 KB
sample01.txt AC 2 ms
1,512 KB
sample02.txt AC 2 ms
1,508 KB
sample03.txt AC 2 ms
1,488 KB
sample04.txt AC 3 ms
1,508 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