結果

問題 No.3291 K-step Navigation
ユーザー ゼリトキ
提出日時 2025-10-03 22:59:07
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,940 bytes
コンパイル時間 3,096 ms
コンパイル使用メモリ 276,508 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-10-03 22:59:12
合計ジャッジ時間 4,099 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 41 WA * 9
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
const long long mod=998244353;
const long long mod100=1000000007;
class UnionFind{
    public:
    int par[200009];
    int siz[200009];
    UnionFind(int N){
        for(int i=1;i<=N;i++) par[i]=-1;
        for(int i=1;i<=N;i++) siz[i]=1;
    }
    int root(int x){
        int start=x;
        while(true){
            if(par[x]==-1) break;
            x=par[x];
        }
        while(true){
            if(par[start]==-1) break;
            int b=start;
            start=par[start];
            par[b]=x;
        }
        return x;
    }
    void unite(int u,int v){
        int RootU=root(u);
        int RootV=root(v);
        if(RootU==RootV) return;
        if(siz[RootU]<siz[RootV]){
            par[RootU]=RootV;
            siz[RootV]=siz[RootU]+siz[RootV];
        }
        else{
            par[RootV]=RootU;
            siz[RootU]=siz[RootU]+siz[RootV];
        }
    }
    bool same(int u,int v){
        if(root(u)==root(v)) return true;
        return false;
    }
};
int main(){
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);
    int N,M;
    ll K;
    int s,t;
    cin>>N>>M>>K>>s>>t;
    K%=2;
    int u[M+1],v[M+1];
    UnionFind UF(N);
    for(int i=1;i<=M;i++){
        cin>>u[i]>>v[i];
        UF.unite(u[i],v[i]);
    }
    if(UF.same(s,t)){
        if(UF.siz[UF.root(s)]>=3){
            cout<<"Yes"<<endl;
            return 0;
        }
        else if(K==1){
            cout<<"Yes"<<endl;
            return 0;
        }
        else{
            cout<<"No"<<endl;
            return 0;
        }
    }
    else{
        if(UF.siz[UF.root(t)]>=2){
            cout<<"Yes"<<endl;
            return 0;
        }
        else if(K==1){
            cout<<"Yes"<<endl;
            return 0;
        }
        else{
            cout<<"No"<<endl;
            return 0;
        }
    }
}
0