結果
問題 |
No.3263 違法な散歩道
|
ユーザー |
|
提出日時 | 2025-09-28 22:58:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 208 ms / 2,000 ms |
コード長 | 5,200 bytes |
コンパイル時間 | 2,015 ms |
コンパイル使用メモリ | 207,036 KB |
実行使用メモリ | 41,044 KB |
最終ジャッジ日時 | 2025-09-28 22:58:51 |
合計ジャッジ時間 | 8,869 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
#include<bits/stdc++.h> //入力系 #define cinll(...) ll __VA_ARGS__; input(__VA_ARGS__); #define cinint(...) int __VA_ARGS__; input(__VA_ARGS__); #define cinstr(...) string __VA_ARGS__; input(__VA_ARGS__); #define cinchar(...) char __VA_ARGS__; input(__VA_ARGS__); #define cindouble(...) double __VA_ARGS__; input(__VA_ARGS__); #define cinvll(a,n) vll a(n); rep(i,n) cin>>a[i]; #define cinvvll(a,n,m) vvll a(n,vll(m)); rep(i,n) rep(j,m) cin>>a[i][j]; #define cinvs(a,n) vs a(n); rep(i,n) cin>>a[i]; #define cinvpll(a,n) vpll a(n); rep(i,n) cin>>a[i].fst>>a[i].snd; //繰り返し系 #define rep1(n) for(ll i=0;i<n;i++) #define rep2(i,n) for(ll i=0;i<n;i++) #define rep3(i,a,n) for(ll i=a;i<n;i++) #define rep4(i,a,n,b) for(ll i=a;i<n;i+=b) #define overload4(a,b,c,d,e,...) e #define rep(...) overload4(__VA_ARGS__,rep4,rep3,rep2,rep1)(__VA_ARGS__) #define mrep1(n) for(ll i=n;i>=0;i--) #define mrep2(i,n) for(ll i=n;i>=0;i--) #define mrep3(i,n,a) for(ll i=n;i>=a;i--) #define mrep4(i,n,a,b) for(ll i=n;i>=a;i-=b) #define mrep(...) overload4(__VA_ARGS__,mrep4,mrep3,mrep2,mrep1)(__VA_ARGS__) //iterator系 #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() //書くのが長いやつ #define fst first #define snd second #define cvvll1(name,a,b) vvll name(a, vll(b)) #define cvvll2(name,a,b,c) vvll name(a, vll(b,c)) #define cvvlloverload2(name,a,b,c,d,...) d #define make_vvll(...) cvvlloverload2(__VA_ARGS__,cvvll2,cvvll1)(__VA_ARGS__) using namespace std; //型系 using ll = long long; using vll = vector<long long>; using vvll = vector<vector<long long>>; using vi = vector<int>; using vvi = vector<vector<int>>; using vb = vector<bool>; using vvb = vector<vector<bool>>; using vd = vector<double>; using vvd = vector<vector<double>>; using vc = vector<char>; using vvc = vector<vector<char>>; using vs = vector<string>; using pll = pair<long long,long long>; using pi = pair<int,int>; using pd = pair<double,double>; using sll = set<long long>; using vsll = vector<set<long long>>; using vpll = vector<pair<long long,long long>>; using vpi = vector<pi>; using vpd = vector<pair<double, double>>; using vvpll = vector<vector<pair<long long, long long>>>; #define vmll vector<mll> #define vvmll vector<vector<mll>> const ll mod = 998244353LL; //const ll mod = 1000000007LL; const ll inf = 1300100100100100100LL; const double PI=3.1415926535897932384626433832795028841971; //表示 #define overload1(a,b,NAME,...) NAME #define coutYesReturn() do {coutYes(); return 0; } while(0) #define coutYesReturnIf(a) do { if(a){ coutYesReturn(); }} while(0) #define coutNoReturn() do {coutNo(); return 0;} while(0) #define coutNoReturnIf(a) do {if(a){ coutNoReturn(); }} while(0) #define coutReturnIf(a,s) do{if(a){cout<<s<<endl; return 0;}}while(0) template<typename... T> void coutll(T... a){ ((cout << a <<" "),...) << endl; } void coutvll(vll &a){ rep(i,a.size()) cout<<a[i]<<" "; cout<<endl; } void coutvll(string name, vll &a){ cout<<name<<":"; coutvll(a); } void coutvlln(vll &a){ rep(i,a.size()) cout<<a[i]<<endl; } void coutYes(){ cout<<"Yes"<<endl; } void coutNo(){ cout<<"No"<<endl; } void coutYesNo(bool a){ cout<<(a?"Yes":"No")<<endl; } void coutIf(bool a, string s, string t){ cout<<(a?s:t)<<endl; } //入力 template<class... T> void input(T&... a){ (cin >> ... >> a); } //複数ソート template<class... T> void sorts(vector<T>&... a){ (sort(all(a)),...); } //便利関数 template<typename T> bool chmax(T &a, T b){ if(a < b) {a = b; return true;} return false; } template<typename T> bool chmin(T &a, T b){ if(a > b) {a = b; return true;} return false; } //配列表示用 template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) { rep(i,vec.size()) os << vec[i] << (i==(ll)vec.size()-1?"":" "); return os; } int main(){ cinll(n, m); auto to_hash = [&](ll a, ll b){ return a*n + b; }; vvll tnexts(n); rep(i,m){ cinll(u, v); u--; v--; tnexts[v].push_back(u); tnexts[u].push_back(v); } cinll(k); vb exists_iwi(n, false); rep(i,k){ cinll(a); a--; exists_iwi[a] = true; } vvll nexts(n*5); // 今まで連続してi人いて、場所jにいる時に行ける場所 rep(i, 5) rep(j, n){ // 岩井星人がいる時は、+1人して次に行く if(exists_iwi[j]){ if(i < 4) for(ll next: tnexts[j]) nexts[to_hash(i,j)].push_back(to_hash(i+1, next)); } else{ for(ll next: tnexts[j]) nexts[to_hash(i,j)].push_back(to_hash(0, next)); } } //型を入力 queue<ll> q; //ここでスタート地点を入れてく q.push(0); vll min_dists(n*5, inf); min_dists[0] = 0; while(!q.empty()){ ll now = q.front(); q.pop(); //ここで次の奴らを追加していく for(ll next: nexts[now]) if(min_dists[next] == inf){ min_dists[next] = min_dists[now]+1; q.push(next); } } ll ans = inf; rep(i,5) chmin(ans, min_dists[to_hash(i, n-1)]); if(ans == inf) cout << "-1" << endl; else cout << ans << endl; return 0; }