結果

問題 No.3263 違法な散歩道
ユーザー Lidelie
提出日時 2025-09-06 13:20:49
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 142 ms / 2,000 ms
コード長 1,236 bytes
コンパイル時間 4,297 ms
コンパイル使用メモリ 287,280 KB
実行使用メモリ 13,712 KB
最終ジャッジ日時 2025-09-06 13:21:02
合計ジャッジ時間 7,687 ms
ジャッジサーバーID
(参考情報)
judge3 / judge
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct dcin{template<typename T>dcin&operator>>(T&x){return std::cin>>x,x--,*this;}}dcin;

int main(){
    ll n,m,k; cin >> n >> m;
    vector e(n,vector<ll>());
    for(ll i = 0;i<m;i++){
        ll u,v; dcin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    cin >> k;
    vector<bool> iwai(n);
    for(ll i = 0;i<k;i++){
        ll v;dcin >> v;
        iwai[v] = true;
    }
    vector dp(5,vector<ll>(n,LLONG_MAX>>4));
    dp[0][0] = 0;
    queue<pair<ll,ll>> q;
    q.emplace(0,0);
    while(q.size()){
        auto[met,cur] = q.front(); q.pop();
        for(ll to : e[cur]){
            if(iwai[to] && met < 4){
                if(dp[met][cur]+1 < dp[met+1][to]){
                    dp[met+1][to] = dp[met][cur]+1;
                    q.emplace(met+1,to);
                }
            }
            if(!iwai[to]){
                if(dp[met][cur]+1 < dp[0][to]){
                    dp[0][to] = dp[met][cur]+1;
                    q.emplace(0,to);
                }
            }
        }
    }
    ll ans = LLONG_MAX;
    for(ll i = 0;i<5;i++)ans = min(ans,dp[i][n-1]);
    if(ans == (LLONG_MAX>>4))ans = -1;
    cout << ans << endl;
}
0