记录编号 589234 评测结果 AAAAAAAAWAAAWWWWTTTT
题目名称 不是一道路径查询问题 最终得分 55
用户昵称 Gravatarflyfree 是否通过 未通过
代码语言 C++ 运行时间 6.274 s
提交时间 2024-07-04 11:57:41 内存使用 33.12 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 100005
ll f[MAXN][100],s[MAXN];
ll find(ll idx,ll c){
//    cout<<"find "<<idx<<" "<<c<<endl;
    if(f[idx][c]==idx){
        return idx;
    }else return f[idx][c]=find(f[idx][c],c);
}
ll n,m,q,v,p=1,cnt;
int  main(){
    freopen("Paths.in","r",stdin);
    freopen("Paths.out","w",stdout);
    cin>>n>>m>>q>>v;
    for(ll i=1;i<=60;i++){
        ll k=v&1;
        v/=2;
        if(k){
            for(ll j=1;j<=cnt;j++){
                s[j]+=p;
            }
        }else{
            s[++cnt]=p;
        }
        p*=2;
    }
    for(ll i=1;i<=cnt;i++)for(ll j=1;j<=n;j++)f[j][i]=j;
//    for(ll i=1;i<=cnt;i++)cout<<s[i]<<endl;
    for(ll i=1;i<=m;i++){
        ll x,y,val;
        cin>>x>>y>>val;
        for(ll j=1;j<=cnt;j++){
            if((val&s[j])==s[j]){
                  ll l=find(x,j),r=find(y,j);
                  f[l][j]=f[r][j];
            }
        }
    }
    for(ll i=1;i<=q;i++){
            ll x,y;
            cin>>x>>y;
            ll ans=0;
            for(ll j=1;j<=cnt;j++){
                if(find(f[x][j],j)==find(f[y][j],j)){
                    ans=1;
                    break;
                }
            }
            if(ans)cout<<"Yes\n";
            else cout<<"No\n";
    }
    return 0;
}