本题的 01 bfs 解法是由 x 向 x+1 和 x×10 转移,还有一种最短路的做法是由 x 向 x×10+y(y∈[0,9]) 转移。都是按照每位计贡献的思路,而本人采用的是后者,关键代码如下:
struct num{
int x, val;
friend bool operator < (const num a, const num b){
return a.val > b.val;
}
};priority_queue<num> heap;
int main(){
for(int i = 1; i < n; ++ i )
for(int j = 0; j < 10; ++ j )
adds(i, (i * 10 + j) % n, j);
memset(dis, 0x3f, sizeof dis);
heap.push((num){1, dis[1] = 1});
while(!heap.empty()){
}
...
}
可以看到,代码中本人只钦定了最高位为 1 的情况,而正确做法应该是将 1 到 9 都放入堆中——可这样是能 AC 的。
我怀疑是 AT 数据不完善的原因,又找了一份题解区的(第一篇) 01 bfs 代码对拍。截止本帖发布大概已经拍完 k≤3×104 的所有情况但没有发现矛盾。
如果各位并没有理解我发帖的目的,那么在这里强调一下:这份“错误”的代码钦定了最高位为 1,也就是对于每个 k 来说,数位和最优的倍数的最高位都是 1。在此向各位大佬求助证明或推翻这个结论。