zoukankan      html  css  js  c++  java
  • 树和图的广度优先遍历

    给定一个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

  • 相关阅读:
    WIN8 下 Hyper-V和Vmware Workstation
    小技巧总结
    工具软件
    php开发入门
    docker的用法总结
    [工具] 同步本地文件夹与VPS中的文件夹
    读书笔记之《The Art of Readable Code》Part 3
    读书笔记之《The Art of Readable Code》Part 2
    正则表达式小试牛刀
    读书笔记之《The Art of Readable Code》part 1
  • 原文地址:https://www.cnblogs.com/sxq-study/p/12233157.html
Copyright © 2011-2022 走看看