题目描述
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。
所有边的长度都是 1,点的编号为 1∼n。
请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。
输入格式
第一行包含两个整数 n 和 m。
接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。
输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。
数据范围
1≤n,m≤105
样例
输入样例:
4 5
1 2
2 3
3 4
1 3
1 4
输出样例:
1
用 dist 数组保存1号节点到各个节点的距离,初始时,都是-1(因为不存在)。
public class Main{
static int N=100010;
static int[] h=new int[N];
static int[] e=new int[N];
static int[] next=new int[N];
static int idx=0;
static int n;
static int m;
static int[] d=new int[N];
public static void add(int a,int b){
e[idx]=b;
next[idx]=h[a];
h[a]=idx++;
}
public static int bfs(){
Queue<Integer> queue=new LinkedList<Integer>();
queue.add(1);
d[1]=0;
while(!queue.isEmpty()){
int t=queue.poll();
for(int i=h[t];i!=-1;i=next[i]){//遍历t节点的每一个邻边 ,边的终点也作为边的起点
int j=e[i];
if(d[j]=-1){//如果j没有被扩展过
d[j]=d[t]+1;
queue.add(j);
}
}
}
return d[n];
}
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] str1 = reader.readLine().split(" ");
n = Integer.parseInt(str1[0]);
m = Integer.parseInt(str1[1]);
Arrays.fill(h, -1);
Arrays.fill(d, -1);
for(int i = 0;i < m;i++)
{
String[] str2 = reader.readLine().split(" ");
int a = Integer.parseInt(str2[0]);
int b = Integer.parseInt(str2[1]);
add(a,b);
}
System.out.println(bfs());
}
}