【模板题】树与图的广度优先遍历

一、AcWing 847. 图中点的层次

【题目描述】
给定一个n nn个点m mm条边的有向图,图中可能存在重边和自环。
所有边的长度都是1 11,点的编号为1 ∼ n 1\sim n1n
请你求出1 11号点到n nn号点的最短距离,如果从1 11号点无法走到n nn号点,输出− 1 -11

【输入格式】
第一行包含两个整数n nnm mm
接下来m mm行,每行包含两个整数a aab bb,表示存在一条从a aa走到b bb的长度为1 11的边。

【输出格式】
输出一个整数,表示1 11号点到n nn号点的最短距离。

【数据范围】
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^51n,m105

【输入样例】

4 5
1 2
2 3
3 4
1 3
1 4

【输出样例】

1

【代码】

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;

const int N = 100010, M = 100010;
int e[M], ne[M], h[N], idx;
int n, m, dis[N];

void add(int u, int v)
{
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}

int bfs()
{
    memset(dis, -1, sizeof dis);
    queue<int> Q;
    dis[1] = 0;
    Q.push(1);
    while (Q.size())
    {
        int t = Q.front();
        Q.pop();
        for (int i = h[t]; ~i; i = ne[i])
            if (!~dis[e[i]]) Q.push(e[i]), dis[e[i]] = dis[t] + 1;
    }
    return dis[n];
}

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);
    }
    cout << bfs() << endl;
    return 0;
}

版权声明:本文为m0_51755720原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。