#include<bits/stdc++.h>
using namespace std;
int b[200010][33];
int n,m,q,k;
const int N=200010;
bool st[N];
int p[N];
int cnt;
int h[N],e[N<<1],ne[N<<1],idx,w[N<<1];
int id[N];
int d[N];
unordered_set<int>Set[N];
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
bool insert(int b[],int x)
{
for(int i=30;i>=0;i--)
{
if(!(x>>i&1)) continue;
if(!b[i]){
b[i]=x;
return 1;
}
x^=b[i];
}
return false;
}
bool insert2(int b[],int x)
{
for(int i=30;i>=0;i--)
{
// if(x==0) return false;
if(!(x>>i&1)) continue;
if(!b[i]){
return 1;
}
x^=b[i];
}
return false;
}
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dfs(int u,int fa,int vv)
{
st[u]=1;
d[u]=vv;
id[u]=cnt;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(j==fa) continue;
Set[cnt].insert(w[i]);
// cout<<w[i]<<endl;
if(st[j])
{
// cout<<u<<" "<<" "<<j<<" "<<(vv^d[u]^(1<<w[i]))<<endl;
// cout<<cnt<<" "<<(vv^d[u]^(1<<w[i]))<<endl;
insert(b[cnt],(vv^d[j]^(1<<w[i])));
}
else dfs(j,u,vv^(1<<w[i]));
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("a.out","w",stdout);
memset(h,-1,sizeof h);
cin>>n>>m>>k>>q;
for(int i=1;i<=n;i++) p[i]=i;
while(m--){
int a,b,c;
cin>>a>>b>>c;
c--;
add(a,b,c);
add(b,a,c);
a=find(a);
b=find(b);
if(a!=b) p[a]=b;
}
for(int i=1;i<=n;i++)
{
if(!st[i])
{
++cnt;
dfs(i,-1,0);
}
}
int ct=0;
while(q--)
{
int s,t;
cin>>s>>t;
// cout<<(d[s]^d[t])<<endl;
if(s==t)
{
puts("Yes");
continue;
}
if(Set[id[s]].size()!=k)
{
puts("No");
continue;
}
if(find(s)!=find(t))
{
puts("No");
}
else
{
int x=(d[s]^d[t]);
// cout<<d[s]<<' '<<d[t]<<" "<<s<<" "<<t<<endl;
// cout<<++ct<<" "<<s<<" "<<t<<x;
// int x2=x;
// for(int i=30;i>=0;i--)
// {
// if((x^b[cnt][i])>x) x^=b[cnt][i];
// if((x2^b[cnt][i])<x2) x2^=b[cnt][i];
// }
// if(x2==0 || x==(1<<k)-1)
// puts("Yes");
// else
// puts("No");
// continue;
// cout<<insert2(b[id[s]],x)<<" "<<x<<" "<<id[s]<<endl;
if(insert2(b[id[s]],x)==false || insert2(b[id[s]],x^((1ll<<k)-1))==false)
puts("Yes");
else
puts("No");
}
}
return 0;
}
浙工大race 线性基
最新推荐文章于 2024-07-20 09:21:06 发布