题目链接:https://www.acwing.com/problem/content/description/849/
时/空限制:1s / 64MB
题目描述
给定一个n个点m条边的有向图,图中可能存在重边和自环。
所有边的长度都是1,点的编号为1~n。
请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。
输入格式
第一行包含两个整数n和m。
接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
数据范围
1≤n,m≤10^5
输入样例
4 5
1 2
2 3
3 4
1 3
1 4
输出样例
1
解题思路
题意:给你n个点和m条边,求1~n的最短距离。
思路:直接从1开始BFS就行了。
Accepted Code:
/*
* @Author: lzyws739307453
* @Language: C++
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const int MAXM = MAXN << 1;
const int inf = 0x3f3f3f3f;
struct edge {
int u, t;
edge() {}
edge(int u, int t) : u(u), t(t) {}
};
struct AdjTab {
int u, v;
AdjTab() {}
AdjTab(int u, int v) : u(u), v(v) {}
}e[MAXN];
bool vis[MAXN];
int f[MAXN], Adj = 0;
void Add_Adj(int u, int v) {
e[++Adj] = AdjTab(f[u], v);
f[u] = Adj;
}
int BFS(int s, int t) {
queue <edge> Q;
Q.push(edge(s, 0));
vis[s] = true;
while (!Q.empty()) {
edge p = Q.front();
Q.pop();
if (!(p.u != t))
return p.t;
for (int i = f[p.u]; ~i; i = e[i].u) {
int v = e[i].v;
if (!vis[v]) {
vis[v] = true;
Q.push(edge(v, p.t + 1));
}
}
}
return -1;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
memset(f, -1, sizeof(f));
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
Add_Adj(u, v);
}
printf("%d\n", BFS(1, n));
return 0;
}