結果
問題 |
No.3263 違法な散歩道
|
ユーザー |
![]() |
提出日時 | 2025-08-14 19:44:55 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,931 bytes |
コンパイル時間 | 4,204 ms |
コンパイル使用メモリ | 187,140 KB |
実行使用メモリ | 307,196 KB |
最終ジャッジ日時 | 2025-08-14 19:45:06 |
合計ジャッジ時間 | 10,221 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 10 TLE * 1 -- * 17 |
ソースコード
//dijkstra //TLE #include <iostream> #include <algorithm> #include <atcoder/all> #include <queue> using namespace std; using namespace atcoder; using ll = long long; //#define endl "\n"; const long long INF = 1000000000000000000; ll N, M, K, A[100009], visited[100009]; vector<vector<ll>> preG; //dijkstra struct edge{ ll pre, to; ll cost; }; vector<vector<edge>> G; vector<ll> dijkstra(int start = 0) { int N = G.size(); vector<ll> dist(N, INF); using classPQ = pair<ll, ll>; priority_queue<classPQ, vector<classPQ>, greater<classPQ>> que; que.emplace(0, start); dist[start] = 0; while(!que.empty()){ auto [d, c] = que.top(); que.pop(); if(dist[c] != d) continue; for(auto& e : G[c]){ if(d + e.cost < dist[e.to]){ dist[e.to] = d + e.cost; que.emplace(dist[e.to], e.to); } } } return dist; } int main(){ cin >> N >> M; preG.resize(N + 1); G.resize(N + 1); for(int i = 0; i < M; i++){ ll u, v; cin >> u >> v; preG[u].push_back(v); preG[v].push_back(u); } cin >> K; for(int i = 0; i < K; i++){ ll a; cin >> a; A[a] = 1; } //空き頂点間を探索 int idx = 0; for(int i = 1; i <= N; i++){ if(A[i] == 0){ idx++; queue<pair<ll,ll>> que; visited[i] = idx; que.push({i, 0}); while(!que.empty()){ auto [pos, cnt] = que.front(); que.pop(); for(auto to: preG[pos]){ if(visited[to] < idx){ if(A[to] == 1 && cnt < 4){ visited[to] = idx; que.push({to, cnt + 1}); } if(A[to] == 0){ visited[to] = idx; G[i].push_back(edge{i, to, cnt + 1}); G[to].push_back(edge{to, i, cnt + 1}); } } } } } } auto dist = dijkstra(1); if(dist[N] == INF) cout << -1 << endl; else cout << dist[N] << endl; return 0; }