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号点的最短距离。

    数据范围
    1 ≤ n,m ≤ 10^5
    输入样例:
    4 5
    1 2
    2 3
    3 4
    1 3
    1 4
    输出样例:
    1

    用邻接表存储图

    代码

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int N = 100010;
    
    int n, m;
    int h[N], e[N], ne[N], idx;
    int q[N], d[N]; 
    
    int bfs()
    {
        int hh = 0, tt = 0;
        
        q[0] = 1;
        memset(d, -1, sizeof d);
        d[1] = 0;
    
        while(hh <= tt)
        {
            int t = q[hh++];
    
            for(int i = h[t]; i != -1; i = ne[i]) //扩展临边
            {
                int j = e[i];
                if(d[j] == -1)
                {
                    d[j] = d[t]+1;
                    q[++tt] = j;
                }
            }
        }
    
        return d[n];
    }
    
    void add(int a, int b)
    {
        e[idx] = b, ne[idx] = h[a], h[a] = idx++;
    }
    
    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;
    }
    
  • 相关阅读:
    网站测试
    shell102输出数组
    shell101变量
    shell100for无参数形式
    shell99函数中传数组
    shell98函数的参数
    将php中session存入redis中
    windows下安装redis客户端
    window下phpstudy开启redis扩展
    *ginx下开启phpredis扩展
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13396917.html
Copyright © 2011-2022 走看看