题目
现在有 个点构成的点集
,每个点有点权
。想用这
个点构造
个无向图
。
对于第 个无向图,牛妹指定了一个参数
。牛妹规定
当且仅当
,其中
表示二进制按位异或运算。
对于第 个无向图,求
到
的最短路径长度,
。
解题思路
对于任意 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; }