acwing 图的广度搜索BFS

目录

  • PAT 1076 Forwards on Weibo
  • AcWing 847. 图中点的层次

  • 图的BFS也是借助队列实现

PAT 1076 Forwards on Weibo

  • 注意控制深度,并且避免影响以查找过的点的深度,也要进行visited判断
  • 测试点4一直报段错误,改变容量至1e5,通过。。。
  • 下次考虑用vector
const int N = 1e5 + 10; // 空间开到1e5,测试点4通过。。。。
int h[N], e[N], ne[N], d[N], n, l, k, idx = 0;
bool visited[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int bfs(int u)
{
    int ret = -1, layer = 0;
    queue<int> m_next;
    m_next.push(u);
    visited[u] = true;
    d[u] = 0;
    while(!m_next.empty())
    {
        int cur = m_next.front();
        m_next.pop();
        if(d[cur] > l)
            break;
        ret++;
        for(int i = h[cur]; i != -1; i = ne[i])
        {
            int j = e[i];
            // 这里特别注意,如果不判断,可能会对之前已经搜索
            // 的位置的层数影响,进而导致后续的层数更新出错
            if(visited[j] == false )
            {
                 d[j] = d[cur] + 1; 
                m_next.push(j);
                visited[j] = true;
            }
        }
    }
    return ret;
}
int main()
{
    memset(h, -1, sizeof(h));
    cin >> n >> l;
    for(int i = 1; i <= n; ++i)
    {
        int nfollow, up;
        cin >> nfollow;
        while(nfollow--)
        {
            cin >> up;
            add(up, i);
        }
    }
    cin >> k;
    int qry;
    while(k--)
    {
        cin >> qry;
        cout << bfs(qry) << endl;
        memset(visited, false, sizeof(visited));
        memset(d, 0, sizeof(d));
    }
    return 0;
}

AcWing 847. 图中点的层次

const int N = 1e5 + 10;
int h[N], e[N], ne[N], n, m, idx = 0, d[N];
bool visited[N];
queue<int> m_next;
void add(int a, int b)
{
    e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
int bfs()
{
    memset(d, -1, sizeof(d));
    m_next.push(1);
    d[1] = 0;
    while(m_next.size())
    {
        int cur = m_next.front();
        m_next.pop();
        for(int i = h[cur]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(d[j] == -1) // 已经走到的点就不用进队列了
                              // 保证进队列的都是不相交的路线
            {
                m_next.push(j);
                d[j] = d[cur] + 1;    
            }
        }
    }
    return d[n];
}

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

你可能感兴趣的:(宽度优先,算法)