图 使用异或快速查询反向边
所有边存在一个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
浙公网安备 33010602011771号