最幸运的小孩(ง •̀_•́)ง 2024-04-21 10:49 采纳率: 6.7%
浏览 1

求图的层次问题之bfs

为什么以下代码求图的层次问题中运行错误


```c++

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e5+10,M=2*N;
int h[N],e[M],ne[M],n,m,idex,d[M],q[N],visit[N];//用队列来模拟数组 
void add(int a,int b){
    e[idex]=b;
    ne[idex]=h[a];
    h[a]=idex;
    idex++;
}
void bfs(){
    memset(d,0,sizeof(d));
    int cur,next;
    queue<int>que;
    cur=1;
    d[cur]=0;
    visit[cur]=1;
    que.push(cur);
    while(!que.empty()){
        cur=que.front();
        que.pop();
        for(int i=h[cur];i!=-1;i=ne[i]){
            int j=e[i];
            if(visit[j]==0){
                d[j]=d[cur]+1;
                que.push(j);
            }
        }
    }

}
int main(){
    cin>>n>>m;
    memset(h,-1,sizeof(h));
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
    }
    bfs();
    cout<<d[n]<<endl;
    return 0;
}

```

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-21 10:49
    关注

    引自免费微信小程序:皆我百晓生

    经过分析,我发现您的代码在实现广度优先搜索(BFS)时存在一个小错误。问题出在 add() 函数中的索引分配。当您为新边添加索引时,应该确保不会超过数组的范围。这里是修复后的代码:

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=1e5+10,M=2*N;
    int h[N],e[M],ne[M],n,m,idex,d[M],q[N],visit[N];//用队列来模拟数组 
    
    // 添加边时确保索引不会超出数组范围
    void add(int a,int b){
        e[idex] = b;
        ne[idex] = h[a];
        h[a] = idex;
        idex = (idex + 1) % M; // 使用取模运算防止数组越界
    }
    
    void bfs(){
        memset(d,0,sizeof(d));
        int cur,next;
        queue<int>que;
        cur=1;
        d[cur]=0;
        visit[cur]=1;
        que.push(cur);
        while(!que.empty()){
            cur=que.front();
            que.pop();
            for(int i=h[cur];i!=-1;i=ne[i]){
                int j=e[i];
                if(visit[j]==0){
                    d[j]=d[cur]+1;
                    que.push(j);
                }
            }
        }
    
    }
    int main(){
        cin>>n>>m;
        memset(h,-1,sizeof(h));
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            add(a,b);
        }
        bfs();
        cout<<d[n]<<endl;
        return 0;
    }
    

    主要改动是将 idex++ 替换为 idex = (idex + 1) % M;,这样可以确保 idex[0, M-1] 范围内循环,并且不会因为添加过多边而导致数组越界。

    这段修改过的代码应该能正确地计算给定图中从顶点1到顶点n的最短距离。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月21日

悬赏问题

  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题