比赛 2026.5.16 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 不是一道路径查询问题 最终得分 100
用户昵称 终焉折枝 运行时间 2.031 s
代码语言 C++ 内存使用 5.77 MiB
提交时间 2026-05-16 09:25:20
显示代码纯文本
#include<iostream>
using namespace std;

#define ull unsigned long long
const int N = 1e5 + 5;
int n, m, q;
ull V;
struct node{
    int u, v;
    ull w;
}e[N << 3];
int tot = 0;
struct ques{
    int qu, qv;
}Q[N << 3];
int f[N];
bool ans[N << 3];

int fd(int x){
    return (f[x] == x) ? x : f[x] = fd(f[x]);
}

void check(ull x){
    for(int i = 1;i <= n;i ++) f[i] = i;
    for(int i = 1;i <= m;i ++){
        if((e[i].w & x) == x){
            int fu = fd(e[i].u);
            int fv = fd(e[i].v);
            if(fu != fv) f[fu] = fv;
        }
    }
    for(int i = 1;i <= n;i ++){
        int tmp = fd(i);
    }
    for(int i = 1;i <= q;i ++){
        if(!ans[i] && (f[Q[i].qu] == f[Q[i].qv])){
            ans[i] = 1;
        }
    }
}

int main(){
    freopen("Paths.in", "r", stdin);
    freopen("Paths.out", "w", stdout);
    cin.tie(0) -> ios::sync_with_stdio(0);
    cin >> n >> m >> q >> V;    
    for(int i = 1;i <= m;i ++){
        int x, y; ull z; cin >> x >> y >> z;
        if(z >= V){
            e[++ tot] = {x, y, z};   
        }
    }
    m = tot;
    for(int i = 1;i <= q;i ++){
        cin >> Q[i].qu >> Q[i].qv;
    }
    check(V);
    for(int k = 0;k < 60;k ++){
        if(!((V >> k) & 1)){
            ull x = (V | (1ull << k)) & ~((1ull << k) - 1);
            check(x);
        }
    }
    for(int i = 1;i <= q;i ++){
        if(ans[i]) cout << "Yes\n";
        else cout << "No\n";
    }
    return 0;
}