一、AcWing 847. 图中点的层次
【题目描述】
给定一个n nn个点m mm条边的有向图,图中可能存在重边和自环。
所有边的长度都是1 11,点的编号为1 ∼ n 1\sim n1∼n。
请你求出1 11号点到n nn号点的最短距离,如果从1 11号点无法走到n nn号点,输出− 1 -1−1。
【输入格式】
第一行包含两个整数n nn和m mm。
接下来m mm行,每行包含两个整数a aa和b bb,表示存在一条从a aa走到b bb的长度为1 11的边。
【输出格式】
输出一个整数,表示1 11号点到n nn号点的最短距离。
【数据范围】
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^51≤n,m≤105
【输入样例】
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版权协议,转载请附上原文出处链接和本声明。