結果
| 問題 | No.3653 Space-Time Courier |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-04 00:26:29 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.90.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,418 bytes |
| 記録 | |
| コンパイル時間 | 1,546 ms |
| コンパイル使用メモリ | 211,244 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2026-08-28 21:13:31 |
| 合計ジャッジ時間 | 7,673 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | TLE * 1 -- * 27 |
ソースコード
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const long long INF = 1e18;
struct Edge { int u, v, w; };
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
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];
vector<Edge> edges(M);
vector<vector<pair<int, int>>> adj(N + 1);
for (int i = 0; i < M; i++) {
cin >> edges[i].u >> edges[i].v >> edges[i].w;
adj[edges[i].u].push_back({edges[i].v, edges[i].w});
}
// 【嘘ポイント】トポロジカルソートをサボり、頂点番号順に1回だけDP
vector<long long> h(N + 1, 0);
for (int u = 1; u <= N; u++) {
for (auto& edge : adj[u]) {
int v = edge.first;
int w = edge.second;
h[v] = min(h[v], h[u] + w); // u < v で定義されたDAGだと完全なhが取れてしまう
}
}
// Johnson の再重み付け
vector<vector<pair<int, long long>>> adj_rw(N + 1);
for (auto& e : edges) {
adj_rw[e.u].push_back({e.v, e.w + h[e.u] - h[e.v]});
}
// 全頂点 Dijkstra
long long ans_cost = INF;
int ans_count = 0;
for (int src = 1; src <= N; src++) {
vector<long long> dist(N + 1, INF);
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq;
dist[src] = 0;
pq.push({0, src});
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (d > dist[u]) continue;
for (auto& edge : adj_rw[u]) {
int v = edge.first;
long long rw = edge.second;
if (dist[v] > d + rw) {
dist[v] = d + rw;
pq.push({dist[v], v});
}
}
}
for (int v = 1; v <= N; v++) {
if (src == v || dist[v] == INF) continue;
long long real_dist = dist[v] - h[src] + h[v];
long long cost = real_dist + P[src] + P[v];
if (cost < ans_cost) {
ans_cost = cost;
ans_count = 1;
} else if (cost == ans_cost) {
ans_count++;
}
}
}
if (ans_cost == INF) cout << -1 << "\n";
else cout << ans_cost << " " << ans_count << "\n";
return 0;
}