UOJ111 APIO2015 雅加达的摩天楼 最短路、根号分治、bitset

传送门


70+Hack数据真是壮观~

不难考虑到一个暴力的做法:设\(f_{i,j}\)表示在第\(i\)个点、从第\(j\)个doge跳过来的最短距离,因为边权为\(1\)所以就是个BFS,复杂度\(O(NM)\)

注意到可以优化一些状态:设\(f_{i,j}\)表示在第\(i\)个点、当前的doge的步长为\(j\)的方案数,然后再跑BFS。

看似这样还是\(O(N^2)\)的,但是实际复杂度变为了\(O(N\sqrt{N})\),复杂度分析考虑根号分治:当步长\(> \sqrt{N}\)时显然每一只doge最多只有\(\sqrt{N}\)个有效状态,所以状态数是\(M\sqrt{N}\)的;而步长\(< \sqrt{N}\)时只有\(\sqrt{N}\)种步长,所以状态数是\(N\sqrt{N}\)的。

然后状态可能装不下,bitset即可。

代码

你可能感兴趣的:(UOJ111 APIO2015 雅加达的摩天楼 最短路、根号分治、bitset)