警示后人:如果你WA 30pts
查看原帖
警示后人:如果你WA 30pts
750375
Len_zh楼主2023/10/19 19:35

写法是bfs , 可能会只有1,2,3,4,5,8六个点通过。

// p1为最小的奇数步数 , p2为偶数步数 , v为邻接表。
void bfs(int rt){
    p2[1]=0;
    queue<int> q;
    
    for(int y:v[1]){
        p1[y] = 1;
        q.push(y);
    }
    
    while (!q.empty()){
        int x = q.front() ; q.pop();
        
        for(int y : v[x]){
            if(p1[x] != INF){
                if (p2[y] != INF) continue;  // 此处不可以使用continue,因为y点可能是偶数走过但是奇数没走过
              	    p2[y]=p1[x]+1;
                    q.push(y);
                
                // cout<<p2[y]<<endl;
            }
            
            if(p2[x] != INF){
                    if (p1[y] != INF)  continue;//这里可以使用continue,因为后面已经没有了。
                    p1[y]=p2[x]+1;
                    q.push(y);
               
                // cout<<p[y]<<endl;
            }
        }
        
    }
}

建议改为:

void bfs(int rt){
    p2[1]=0;
    queue<int> q;
    
    for(int y:v[1]){
        p1[y] = 1;
        q.push(y);
    }
    
    while (!q.empty()){
        int x = q.front() ; q.pop();
        
        for(int y : v[x]){
            if(p1[x] != INF){
                if (p2[y] == INF){
                    p2[y]=p1[x]+1;
                    q.push(y);
                }
                // cout<<p2[y]<<endl;
            }
            
            if(p2[x] != INF){
                    if (p1[y] == INF){
                    p1[y]=p2[x]+1;
                    q.push(y);
                }
                // cout<<p[y]<<endl;
            }
        }
        
    }
}

2023/10/19 19:35
加载中...