結果
問題 |
No.3263 違法な散歩道
|
ユーザー |
|
提出日時 | 2025-09-08 17:05:51 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 257 ms / 2,000 ms |
コード長 | 1,141 bytes |
コンパイル時間 | 3,926 ms |
コンパイル使用メモリ | 293,308 KB |
実行使用メモリ | 26,996 KB |
最終ジャッジ日時 | 2025-09-08 17:06:01 |
合計ジャッジ時間 | 9,157 ms |
ジャッジサーバーID (参考情報) |
judge / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll n, m; cin >> n >> m; vector<vector<ll>> G(n); rep(i, m) { ll u, v; cin >> u >> v; --u; --v; G[u].push_back(v); G[v].push_back(u); } ll k; cin >> k; set<ll> bad; rep(i, k) { ll a; cin >> a; bad.insert(a - 1); } vector<vector<array<ll,3>>> D(n, vector<array<ll,3>>(5, {LLONG_MAX, -1, -1})); D[0][0] = {0, -1, -1}; queue<pair<ll,ll>> q; q.push({0, 0}); while (!q.empty()) { auto [v, b] = q.front(); q.pop(); ll dist = D[v][b][0]; for (ll to : G[v]) { if (bad.count(to)) { if (b < 4 && D[to][b+1][0] > dist + 1) { D[to][b+1] = {dist + 1, v, b}; q.push({to, b+1}); } } else { if (D[to][0][0] > dist + 1) { D[to][0] = {dist + 1, v, b}; q.push({to, 0}); } } } } ll ans = LLONG_MAX; for (int b = 0; b < 5; ++b) ans = min(ans, D[n-1][b][0]); cout << (ans == LLONG_MAX ? -1 : ans) << '\n'; }