結果
問題 |
No.3263 違法な散歩道
|
ユーザー |
![]() |
提出日時 | 2025-09-07 12:42:06 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 472 ms / 2,000 ms |
コード長 | 1,855 bytes |
コンパイル時間 | 4,078 ms |
コンパイル使用メモリ | 199,392 KB |
実行使用メモリ | 39,684 KB |
最終ジャッジ日時 | 2025-09-07 12:42:19 |
合計ジャッジ時間 | 12,016 ms |
ジャッジサーバーID (参考情報) |
judge / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <set> #include <queue> #include <atcoder/all> using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector<int>; using vvi = vector<vi>; using vvvi = vector<vvi>; using vll = vector<ll>; using vvll = vector<vll>; using vvvll = vector<vvll>; using vmi = vector<mint>; using vvmi = vector<vmi>; using vvvmi = vector<vvmi>; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) using p = pair<int, int>; int inf = 1e9; int main(){ int n, m; cin >> n >> m; vector<p> vp(m); rep(i, m){ int u, v; cin >> u >> v; vp[i] = {u-1, v-1}; } int k; cin >> k; set<int> a; rep(i, k){ int b; cin >> b; a.insert(b-1); } vvi adj(6*n); rep(i, m){ auto [u, v] = vp[i]; if(a.count(v)){ rep(j, 5){ adj[u+j*n].push_back(v+j*n + n); } }else{ rep(j, 5){ adj[u+j*n].push_back(v); } } if(a.count(u)){ rep(j, 5){ adj[v+j*n].push_back(u+j*n + n); } }else{ rep(j, 5){ adj[v+j*n].push_back(u); } } } queue<int> q; q.push(0); vi dist(6*n, inf); dist[0] = 0; while(!q.empty()){ int u = q.front(); q.pop(); for(auto v:adj[u]){ if(dist[v] == inf){ dist[v] = dist[u]+1; q.push(v); } } } int ans = inf; rep(i, 5)ans = min(ans, dist[i*n-1 + n]); cout << (ans == inf ? -1 : ans) << endl; return 0; }