給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環。java
全部邊的長度都是1,點的編號爲1~n。數組
請你求出1號點到n號點的最短距離,若是從1號點沒法走到n號點,輸出-1。ui
輸入格式
第一行包含兩個整數n和m。this
接下來m行,每行包含兩個整數a和b,表示存在一條從a走到b的長度爲1的邊。spa
輸出格式
輸出一個整數,表示1號點到n號點的最短距離。code
數據範圍
1≤n,m≤10^5 1≤n,m≤10^5xml
輸入樣例:
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()); } }