给定一个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());
        }
        
}

 

posted on 2020-02-03 13:43  qdu_lkc  阅读(185)  评论(0编辑  收藏  举报