树和图的广度优先遍历

给定一个n个点m条边的有向图,图中可能存在重边和自环。

所有边的长度都是1,点的编号为1~n。

请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。

输入格式

第一行包含两个整数n和m。

接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。

输出格式

输出一个整数,表示1号点到n号点的最短距离。

数据范围

1n,m1051≤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 }
View Code

end

原文地址:https://www.cnblogs.com/sxq-study/p/12233157.html