求图的最短路问题(图的广度优先遍历) (10/12)

发布时间 2023-10-12 10:46:16作者: 敲代码的6
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1000010;
int h[N],e[N], ne[N], idx=0;
int d[N]; int m, n;
queue<int>q;
//链表连图是将节点和下一层所有节点相连
void add(int a, int b) {
    e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}

int bfs() {
    q.push(1);//起始位置
    d[1] = 0;//第一层为0
    while (!q.empty()) {
        int t = q.front();//注意不要放反,先取出再弹出
         q.pop();
        for (int i = h[t]; i != -1; i = ne[i]) {//走下一层所有节点
             int j=e[i];//把下一节点 节点值取出
            if (d[j] == -1) {
                d[j] = d[t] + 1;//没遍历过就记录深度,注意是上一节点层数+1
                q.push(j);//把节点存入,等待遍历
            }
        }
    }
    return d[n];
}

int main()
{
    memset(d, -1, sizeof d);
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);

    for (int i = 0; i < m; i++)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        add(a, b);
    }

    cout << bfs() << endl;

    return 0;
}