牛客练习赛66-B异或图

异或图

https://ac.nowcoder.com/acm/contest/6112/B

题意:n个点 每个点上有边权a[i] q次询问 每次询问给出k x y,只有a[x]⊕a[y]=k时有边,问x到y的最短距离。
思路:首先要知道异或一个知识点 a⊕b=c -> c⊕b=a, c⊕a=b.(证明过程可以自己手写模拟一下) 且交换律在异或运算中也满足,所以可以得出k⊕a[x]=a[y]。所以我们对每次询问的x和y首先先考虑a[x]!=a[y] 那么就直接判断 a[x]⊕a[y]是否等于k,如果是就是输出1,不是输出-1.如果a[x]=a[y]那么就去寻找有没有存在a[p]=a[x]⊕k(因为需要寻找一个中间量 让a[x]先到a[p]再到a[y]),如果有,那么这条路距离就是2,没有就是-1。剩下的情况就是输出-1。ps.标记量建议用数组 2的20次也就1e6多点 我第一次用map t了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int _;
int vis[1050000];
int n,q;
const int N=1e6+5;
int a[N];
int main() {
    cin>>n>>q;
    for (int i=1;i<=n;i++)
    {
        scanf("%d",a+i);
        vis[a[i]]=1;
    }
    int k,c,b;
    while (q--){
        scanf("%d%d%d",&k,&c,&b);
        c=a[c];
        b=a[b];
        if ((c^b)==k)
            puts("1");
        else if (c==b&&vis[k^c]==1)
            puts("2");
        else
            puts("-1");
    }
    return 0;
}


全部评论
只有当边权异或起来为k的时候 两点间才有边 我们对于任意的x都有且仅有一种y使得 x⊕y=k 同理 y也只能⊕x=k 所以在任意一个连通的图里面 边权要么是x 要么是y,x-x的距离就是2。x到y的距离就是1,y到y的距离也是1.
2 回复 分享
发布于 2020-06-27 19:33
楼主 ,为什么没有路径长度大于2的可能呢
1 回复 分享
发布于 2020-06-27 17:16
主要是超时好厉害, c++11 一直T , C ++ 14 就好了
点赞 回复 分享
发布于 2020-06-26 22:26

相关推荐

不愿透露姓名的神秘牛友
今天 20:30
点赞 评论 收藏
分享
04-27 08:59
常州大学 Java
牛客139242382号:《两门以上汇编语言》
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务