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