给定一个n个点m条边的有向图,图中可能存在重边和自环。
所有边的长度都是1,点的编号为1~n。
请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。
输入格式
第一行包含两个整数n和m。
接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
数据范围
1≤n,m≤1051≤n,m≤105
输入样例:
4 5
1 2
2 3
3 4
1 3
1 4
输出样例:
1
########################################################
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 1e5+10; 5 6 vector<int> h(N, -1), e(N, 0), ne(N, 0); 7 int idx = 0; 8 vector<int> d(N, -1);//代表从一号点到每一个节点的最短距离 9 //把b点加在a后面 10 void add(int a, int b){ 11 e[idx] = b; 12 ne[idx] = h[a]; 13 h[a] = idx ++; 14 } 15 16 void bfs(int u){ 17 queue<int> q; 18 q.push(u); 19 d[u] = 0; 20 while(!q.empty()){ 21 int t = q.front(); 22 q.pop(); 23 for(int i = h[t];i != -1;i = ne[i]){ 24 int j = e[i]; 25 if(d[j] == -1){ 26 q.push(j); 27 d[j] = d[t] + 1; 28 } 29 } 30 } 31 } 32 int main(){ 33 int n, m; 34 cin >> n >> m; 35 for(int i = 0;i < m;++i){ 36 int a, b; 37 cin >> a >> b; 38 add(a, b); 39 } 40 bfs(1); 41 cout << d[n] << endl; 42 return 0; 43 }
end