zoukankan      html  css  js  c++  java
  • 847. 图中点的层次

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

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

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

    输入格式

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

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

    输出格式

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

    数据范围

    1n,m10^1≤n,m≤10^5

    输入样例:

    4 5
    1 2
    2 3
    3 4
    1 3
    1 4
    

    输出样例:

    首先数据范围10^5,所以邻接表

    代码:
    import java.util.ArrayDeque;
    import java.util.Arrays;
    import java.util.Scanner;
    class Node{
            int x;
            int step;
            public Node(int x,int step){
                    this.x=x; this.step=step;
            }
    }
    public class Main{
            static final int N=100005;
            static int n,m;
            static int e[]=new int[N];
            static int ne[]=new int[N];
            static int h[]=new int[N];
            static boolean vis[]=new boolean[N];//vis标记,防止重边和自环
            static int idx;
            static ArrayDeque<Node> q=new ArrayDeque<Node>();
            static void add(int a,int b){
                    e[idx]=b;
                    ne[idx]=h[a];
                    h[a]=idx++;
            }
            static int bfs(){
                    vis[1]=true;
                    q.offer(new Node(1,0));
                    while(!q.isEmpty()){
                            Node t=q.poll();
                             if(t.x==n)  return t.step;
                            for(int i=h[t.x];i!=-1;i=ne[i]){
                                    int j=e[i];//e数组用来保存数据
                                    if(!vis[j]){
                                            q.offer(new Node(j,t.step+1));
                                            vis[j]=true;
                                    }
                            }
                    }
                    return -1;
            }
            public static void main(String[] args) {
                    Scanner scan=new Scanner(System.in);
                    n=scan.nextInt();
                    m=scan.nextInt();
                    Arrays.fill(h, -1);
                    while(m-->0){
                            int a=scan.nextInt();
                            int b=scan.nextInt();
                            add(a,b);
                    }
                    System.out.println(bfs());
            }
            
    }
  • 相关阅读:
    蓝桥杯基础练习 高精度加法
    int和string的相互装换 (c++)
    蓝桥杯基础练习 十六进制转八进制
    markdown笔记
    hdu1384Intervals(差分约束)
    【Android】Android Studio 设置
    【调试】pthread.c:(.text+0xa2):对‘pthread_create’未定义的引用
    【STM32】开拓者MiniSTM32RBT6开发板原理图
    [小技巧]解决Word转PDF时,图片变模糊的问题
    Java十六进制字符串转换说明
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12255391.html
Copyright © 2011-2022 走看看