結果
| 問題 | No.3653 Space-Time Courier |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-20 11:16:29 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.90.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,958 bytes |
| 記録 | |
| コンパイル時間 | 2,690 ms |
| コンパイル使用メモリ | 178,492 KB |
| 実行使用メモリ | 52,480 KB |
| 最終ジャッジ日時 | 2026-08-28 20:54:04 |
| 合計ジャッジ時間 | 33,127 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 TLE * 6 -- * 9 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const long long INF = 1e18; // 十分に大きな値
int main() {
// 入出力の高速化
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, M;
if (!(cin >> N >> M)) return 0;
vector<long long> P(N + 1);
for (int i = 1; i <= N; ++i) {
cin >> P[i];
}
// dist[i][j] : i から j への最短距離
vector<vector<long long>> dist(N + 1, vector<long long>(N + 1, INF));
for (int i = 1; i <= N; ++i) {
dist[i][i] = 0;
}
// 辺の入力を受け取る
for (int i = 0; i < M; ++i) {
int u, v;
long long t;
cin >> u >> v >> t;
// 多重辺がある場合は最小のものを採用
dist[u][v] = min(dist[u][v], t);
}
// ワーシャルフロイド法 (O(N^3))
for (int k = 1; k <= N; ++k) {
for (int i = 1; i <= N; ++i) {
if (dist[i][k] == INF) continue; // 到達不可ならスキップ
for (int j = 1; j <= N; ++j) {
if (dist[k][j] == INF) continue;
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
long long min_cost = INF;
long long count = 0;
// 最小コストとそのペア数を計算 (O(N^2))
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) {
if (i == j) continue; // 異なるステーション間のみ
if (dist[i][j] != INF) {
long long cost = dist[i][j] + P[i] + P[j];
if (cost < min_cost) {
min_cost = cost;
count = 1;
} else if (cost == min_cost) {
count++;
}
}
}
}
// 出力
if (min_cost == INF) {
cout << -1 << "\n";
} else {
cout << min_cost << " " << count << "\n";
}
return 0;
}