比赛 2026.5.16 评测结果 AAAAAAAAAAAAAAAATTTT
题目名称 不是一道路径查询问题 最终得分 80
用户昵称 郑霁桓 运行时间 5.377 s
代码语言 C++ 内存使用 24.92 MiB
提交时间 2026-05-16 09:03:50
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,T,xx,yy,V,zz,pv,vv,fa[60][100005],as,vs[1000005];
struct eg{
    long long to,vl;
};
vector<eg>v[100005];
queue<long long>q; 
inline long long fd(long long x,long long a2){
    if(fa[a2][x]==x) return x;
    return fa[a2][x]=fd(fa[a2][x],a2);
}
inline void bfs(long long a2){
    for(long long i=1;i<=n;i++) fa[a2][i]=i,vs[i]=0;
    for(long long i=1;i<=n;i++){
        if(!vs[i]){
            while(!q.empty()) q.pop();
            q.push(i);
            vs[i]=1;
            while(!q.empty()){
                long long tp=q.front();
                q.pop();
                for(long long j=0;j<v[tp].size();j++){
                    if((v[tp][j].vl&vv)==vv&&!vs[v[tp][j].to]){
                        q.push(v[tp][j].to);
                        fa[a2][fd(v[tp][j].to,a2)]=i;
                        vs[v[tp][j].to]=1;
                    }
                }
            }
        }
    }
    return;
}
int main(){
    freopen("Paths.in","r",stdin);
    freopen("Paths.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>T>>V;
    for(long long i=1;i<=m;i++){
        cin>>xx>>yy>>zz;
        v[xx].push_back({yy,zz});
        v[yy].push_back({xx,zz});
    }
    for(long long i=59;i>=0;i--){
        vv=pv+(1ll<<i);
        bfs(i);
        if((V>>i)&1) pv+=(1ll<<i);
    }
    while(T--){
        cin>>xx>>yy;
        vv=pv=0;
        as=0;
        for(long long i=59;i>=0;i--){
            vv=pv+(1ll<<i);
            if((V>>i)&1) pv+=(1ll<<i);
            if(vv>=V){
                if(fd(xx,i)==fd(yy,i)){
                    as=1;
                    break;
                }
            }
        }
        if(as) cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}