清风

导航

图 使用异或快速查询反向边

所有边存在一个edge[]数组里面,然后假设edge[0]是第一个正向边,那么edge[1]就是它的反向边。edge[2]是第一个正向边,edge[3]就是它的反向边。

现在知道x,怎么快速找edge[x]的反向边呢?

答案: edge[x^1]

为什么?

因为1除了最低位是1以外其他位都是0,而\forall x, 0 XOR x = x,所以只要考虑最低位就行啦。

x的最低位为0时,0 XOR 1 = 1,最低位是1时,1 XOR 1 = 0。所以就有

0 XOR 1 = 1
1 XOR 1 = 0
2 XOR 1 = 3
3 XOR 1 = 2
4 XOR 1 = 5
5 XOR 1 = 4
6 XOR 1 = 7
7 XOR 1 = 6
8 XOR 1 = 9
9 XOR 1 = 8
10 XOR 1 = 11
11 XOR 1 = 10
12 XOR 1 = 13
13 XOR 1 = 12
14 XOR 1 = 15
15 XOR 1 = 14
16 XOR 1 = 17
17 XOR 1 = 16
18 XOR 1 = 19
19 XOR 1 = 18

等等。

例外

如果你比较中意edge[]1开始存而不是0,那把xor的参数换成0就行啦。类似地有

0 XOR 0 = 0
1 XOR 0 = 1
2 XOR 0 = 2
3 XOR 0 = 3
4 XOR 0 = 4
5 XOR 0 = 5
6 XOR 0 = 6
7 XOR 0 = 7
8 XOR 0 = 8
9 XOR 0 = 9
10 XOR 0 = 10
11 XOR 0 = 11
12 XOR 0 = 12
13 XOR 0 = 13
14 XOR 0 = 14
15 XOR 0 = 15
16 XOR 0 = 16
17 XOR 0 = 17
18 XOR 0 = 18
19 XOR 0 = 19

posted on 2016-12-22 20:38  清风2009  阅读(578)  评论(1编辑  收藏  举报