题目
现在有 个点构成的点集
,每个点有点权
。想用这
个点构造
个无向图
。
对于第 个无向图,牛妹指定了一个参数
。牛妹规定
当且仅当
,其中
表示二进制按位异或运算。
对于第 个无向图,求
到
的最短路径长度,
。
解题思路
对于任意 3 个整数 ,若
,则有
,
。
- 如果
a[x] ^ k == a[y],表示(x,y)是无向图中的一个边,距离为 1。 - 如果上述条件不成立,判断
a[x] ^ k是否存在,如果不存在,表示这个点是独立的,返回 -1。
如果存在,判断a[x]与a[y]是否相等,如果相等,表示点 x 和 y 都与权值为a[x]^k的点相邻,所以距离为 2。 - 以上条件均不成立,返回 -1。
C++代码
#include<cstdio>
#include<vector>
using namespace std;
int exist[1048576];
int main(){
int n, q;
scanf("%d%d", &n, &q);
vector<int> a(n+1);
for(int i=1; i<=n; ++i){
scanf("%d", &a[i]);
exist[a[i]] = 1;
}
int k, x, y;
for(int i=0; i<q; ++i){
scanf("%d%d%d", &k, &x, &y);
int ax = a[x];
int ay = a[y];
int b = ax ^ k;
int ans = -1;
if(ay==b)
ans = 1;
else if(exist[b]==1 && ax==ay)
ans = 2;
printf("%d\n", ans);
}
return 0;
}
京公网安备 11010502036488号