| 比赛 |
2026.5.16 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
不是一道路径查询问题 |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
2.031 s |
| 代码语言 |
C++ |
内存使用 |
5.77 MiB |
| 提交时间 |
2026-05-16 09:25:20 |
显示代码纯文本
#include<iostream>
using namespace std;
#define ull unsigned long long
const int N = 1e5 + 5;
int n, m, q;
ull V;
struct node{
int u, v;
ull w;
}e[N << 3];
int tot = 0;
struct ques{
int qu, qv;
}Q[N << 3];
int f[N];
bool ans[N << 3];
int fd(int x){
return (f[x] == x) ? x : f[x] = fd(f[x]);
}
void check(ull x){
for(int i = 1;i <= n;i ++) f[i] = i;
for(int i = 1;i <= m;i ++){
if((e[i].w & x) == x){
int fu = fd(e[i].u);
int fv = fd(e[i].v);
if(fu != fv) f[fu] = fv;
}
}
for(int i = 1;i <= n;i ++){
int tmp = fd(i);
}
for(int i = 1;i <= q;i ++){
if(!ans[i] && (f[Q[i].qu] == f[Q[i].qv])){
ans[i] = 1;
}
}
}
int main(){
freopen("Paths.in", "r", stdin);
freopen("Paths.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n >> m >> q >> V;
for(int i = 1;i <= m;i ++){
int x, y; ull z; cin >> x >> y >> z;
if(z >= V){
e[++ tot] = {x, y, z};
}
}
m = tot;
for(int i = 1;i <= q;i ++){
cin >> Q[i].qu >> Q[i].qv;
}
check(V);
for(int k = 0;k < 60;k ++){
if(!((V >> k) & 1)){
ull x = (V | (1ull << k)) & ~((1ull << k) - 1);
check(x);
}
}
for(int i = 1;i <= q;i ++){
if(ans[i]) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}