图 使用异或快速查询反向边
所有边存在一个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