BFS 爆TLE&MLE的教训

P2895 [USACO08FEB] Meteor Shower S

hiro653 @ 2022-11-05 14:32:15

首先我们知道,BFS理论上每个点只需要判断一次就行(每一步标记已经扫过的点),时间复杂度和空间复杂度应该不会超O(n),那么为什么还会产生TLE或者MLE的结果呢?请看下面的分析:

  • TLE:我在这道题上出现TLE错误的主要原因是对于将标记位设置为1的时间不对。对于符合条件且未扫描过的点,我们需要进行入队的操作,并且在执行这一个入队操作的同时就应该将这个点的标志位设置为1,而不应该在将一个点从队首取出时再设置为1.如果采用后面的方法,就可能导致符合条件的点入队了多次的情况发生。
  • MLE:结合上面TLE产生的原因,不难推知如果有过多的相同结点入队,将造成极大的冗余,进而产生MLE的错误。\ 综上,BFS产生TLE或者MLE错误时,可以检查一下在结点入队之前是否已经将其标记。
  • 附上两种形式的代码供大家参考

    
    while(!q.empty()){
    
    node fro=q.front();
    q.pop();
    vis[q.x][q.y]=1;
    
    .....
    }

while(!q.empty()){

if(check(x,y)){

     vis[x][y]=1;
     node tmp;
     tmp.x=x,tmp.y=y;
     q.push(tmp);

}

}


by xqi_zh @ 2023-03-18 17:26:54

MLE终于过了,谢大佬


by Mrlaolu @ 2023-12-08 14:06:06

%%%%谢谢大佬,MLE过了


|