记录编号 589211 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 不是一道路径查询问题 最终得分 100
用户昵称 Gravatar小金 是否通过 通过
代码语言 C++ 运行时间 1.786 s
提交时间 2024-07-03 17:48:49 内存使用 12.21 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,q,fa[100010][65],b[65];
long long ma;
int find(int x, int i) 
{
    if(fa[x][i]==x) return x;
    return fa[x][i]=find(fa[x][i],i);
}
int main() {
    freopen("Paths.in","r",stdin);
    freopen("Paths.out","w",stdout);
	scanf("%d%d%d%lld",&n,&m,&q,&ma);
	for(int i=1;i<=n;i++)
	{
	    for(int j=0;j<=61;j++)
        {
            fa[i][j]=i;
        }	
    }	
	for(int i=60;~i;i--)
	{
	    if(ma&(1ll<<i))	b[i]=1;
    }	
	for(int i=1;i<=m;i++) 
    {
		int u,v;
		long long w;
		scanf("%d%d%lld",&u,&v,&w);
		for(int j=60;~j;j--) 
        {
			bool f=(w&(1ll<<j));
			if((!b[j])&&f) fa[find(u,j)][j]=find(v,j);
			if(b[j]&&(!f)) break;
		}
		if((w&ma)==ma) fa[find(u,61)][61]=find(v,61);
	}
	for(int i=1;i<=q;i++) 
    {
		int u,v,flag=0;
		scanf("%d%d",&u,&v);
		for(int j=61;~j;j--)
		{
		    if(find(u,j)==find(v,j)) 
            {
				flag=1;
				break;
			}
        }
		if(flag==1) printf("Yes\n");
        else printf("No\n");
	}
	return 0;
}