• 847. 图中点的层次


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

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 1e5 + 10;
    
    int n,m;
    int h[N],ne[N],e[N],idx;
    //d是距离q是队列
    int d[N],q[N];
    
    void add(int a,int b){
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    
    int bfs(){
        int tt = 0,hh = 0;//队头队尾
        
        //第一个元素就是我们的起点1
        q[0] = 1;
        
        //初始化距离
        memset(d,-1,sizeof d);
        
        //一开始只有第一个元素被遍历过了
        d[1] = 0;
        
        //宽搜框架
        /*
        1.队列不空
        2.取得队头
        3.扩展当前这个点
        4.用j表示当前可以到达的这个点
        5.判断是否被扩展到j这个点,如果没有被扩展到就扩展下 d[j] = d[t] + 1;
        6.并且把j这个点加到我们的队列里边去
        7.返回最小距离
        */
        while(tt >= hh){
            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];
        
    }
    
    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;
        
    }
    

      

  • 相关阅读:
    前端3
    前端-1
    第三十七章 MYSQL(二)
    第三十六章 MYSQL语句(一)
    第三十五 MYSQL 语句
    数字转换成中文大小写、金额大小写
    NPOI随笔——图片在单元格等比缩放且居中显示
    NPOI随笔——单元格样式CellStyle问题
    C++、C#、VB各语言日志代码
    .NET认识与理论总结
  • 原文地址:https://www.cnblogs.com/luyuan-chen/p/11727057.html
Copyright © 2020-2023  润新知