给定一个$n$个点的有向图和一个常数$c$,其中对于任意的$i$和$j$,有一条边权$(i\operatorname{xor}j)\times C$的边。还给定$m$条边,第$i$条边从$u_i$到$v_i$,边权为$w_i$,求出$s$到$t$的最短路。
$\texttt{Data Range:}n\leq 10^5,m\leq 5\times 10^5,1\leq u_i,v_i\leq n,1\leq w_i\leq 100$
链接
题解
直接建图跑最短路是不行的,因为边数是$n^2m$级别的,要优化建图。
对于$x$到$y$的边,其权值为$x\operatorname{xor}y$,也即
其中,$y_i$为$y$在二进制下第$i$位的值$\times2^i$。
为什么呢?
因为对于每一次异或,只会修改一个位置上的数,对别的位置没有影响。所以说从$x$到$y$只需要这样一个一个走即可,对答案没有影响
所以只需要对任意的点$i$向$2^j$连$i\operatorname{xor}2^j$的边,再跑最短路即可,边数立马降至$n\log n+m$级别。
代码
1 | // luogu-judger-enable-o2 |