比赛 2024暑期C班集训3 评测结果 AAAAAAAATTTTTTTTTTTT
题目名称 不是一道路径查询问题 最终得分 40
用户昵称 123 运行时间 12.210 s
代码语言 C++ 内存使用 22.95 MiB
提交时间 2024-07-03 11:11:22
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,m,q,tot=0,head[N],nxt[N],idx[N],vis[N],s,t,flag=0;
long long v,val[N],ans=-1;
void add(int a,int b,long long c)
{
    val[++tot]=c;
    idx[tot]=b;
    nxt[tot]=head[a];
    head[a]=tot;
}
void dfs(int now,long long cnt)
{
    if (now==t)
    {
        ans=max(ans,cnt);
        if (ans>=v)
        {
            flag=1;
        }
        return ; 
    }
    for (int i=head[now];i;i=nxt[i])
    {
        int y=idx[i];
        if (vis[i])
        {
            continue;
        }
        if (cnt==0 && now==s)
        {
            if (val[i]<=ans)
            {
                continue;
            }
            vis[i]=1;
            dfs(y,val[i]);
            vis[i]=0;
        }
        else
        {
            if (val[i]<=ans)
            {
                continue;
            }
            vis[i]=1;
            dfs(y,cnt&val[i]);
            vis[i]=0;
        }
    }
    if (flag)
    {
        return ;
    }
}
int main() {
    freopen("Paths.in","r",stdin);
    freopen("Paths.out","w",stdout);
    scanf("%d%d%d%lld",&n,&m,&q,&v);
    while (m--) 
    {
        int a,b;
        long long c;
        scanf("%d%d%lld",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
    while (q--)
    {
        ans=-1;
        flag=0;
        scanf("%d%d",&s,&t);
        dfs(s,0);
        if (flag)
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }
}