题意:给n个正方形分子,分子的边在一定条件下可以结合,求这些分子能不能形成无穷大的结构。
我们从分子的某条边开始铺,假设从下图中的边K+开始铺。K+与K-相结合,再下一步,可以从C-、D+、D+边铺。假设D+与D-相结合后,结合的分子有一条边为K+,那么下一步可以从此K+边开始。问题又回到了起点,按照与之前相同的选择,可以不断重复而组合成无穷大的结构。也就是说,如果从某条边开始,不断地铺,能够到达一条跟它有相同标号的边,那么能够形成无穷大的结构;否则,不能够形成。
考虑以图来建模,把标号作为结点,结点的数目最多有26*2个(不考虑00,因为00不可能在有向圈上)。假设正方形的四条边的标号分别为abcd,记dual(a)表示可以和标号a相结合的标号(如K+和K-可以结合),那么dual(a)可以到达b,dual(b)可以到达a…。问题转化为了找有向图中是否存在有向圈,用拓扑排序可以做。
PS:把dual函数修改了后从50ms到了40ms,rank top 了…
1 | int dual(int v) { |
1 |
|