玄关求条
查看原帖
玄关求条
1632009
pxn1234楼主2025/7/2 21:27
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
#define N 500010
#define pii pair<int,int>

int n, m, q, v;
int qwq[100];
int t;
struct Edge {
    int x, y, v;
} edge[N];
int fa[62][N];
int getfa(int x, int sb) {
    if(fa[sb][x] == x)return x;
    else return fa[sb][x] = getfa(fa[sb][x], sb);
}
void merge(int x, int y, int sb) {
    x = getfa(x, sb);
    y = getfa(y, sb);
    fa[sb][x] = y;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> q >> v;
    for(int i = 1; i <= m; i++) {
        int x, y, vv;
        cin >> x >> y >> vv;
        edge[i] = {x, y, vv};
    }
    int tmp = v;
    while(tmp) {
        qwq[t] = (tmp & 1);
        t++;
        tmp >>= 1;
    }
    for(int i=t;i>=0;i--)cout<<qwq[i];
    cout<<'\n';
    for(int i = 1; i <= t; i++) {
        for(int j = 1; j <= n; j++) {
            fa[i][j] = j;
        }
    }
    for(int i = 1; i <= m; i++) {
        for(int j = 1; j<=t; j++) {
            bool flag = edge[i].v >> (t - j) & 1;
            if((!qwq[j]) && flag) merge(edge[i].x, edge[i].y, j);
            else if(qwq[j] && !flag) break;
        }
        if((edge[i].v & v) >= v) merge(edge[i].x, edge[i].y, 61);
    }
    for(int i = 1; i <= q; i++) {
        int x, y;
        cin >> x >> y;
        bool flag = false;
        for(int j = 1; j <= 61; j++) {
            if(getfa(x, j) == getfa(y, j)) {
                flag = true;
                break;
            }
        }
        if(flag) cout << "Yes\n";
        else cout << "No\n";
    }
    return 0;
}

2025/7/2 21:27
加载中...