結果

問題 No.3653 Space-Time Courier
コンテスト
ユーザー Rino-program
提出日時 2026-07-20 11:16:29
言語 C++23(gcc16)
(gcc 16.1.0 + boost 1.90.0)
コンパイル:
g++-16 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
TLE  
実行時間 -
コード長 1,958 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#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;
}
0