847. 图中点的层次

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。
所有边的长度都是 1,点的编号为 1∼n。
请你求出 1号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。
输入格式
第一行包含两个整数 n 和 m。
接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。
输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。
数据范围
1≤n,m≤105
输入样例:

  1. 4 5
  2. 1 2
  3. 2 3
  4. 3 4
  5. 1 3
  6. 1 4

输出样例:

  1. 1

思路

类型:带环的权重一致的最短路问题
类似与走迷宫问题,从数组变成了图,其它基本一致。

  1. import java.util.*;
  2. public class Main {
  3. static int n, m, idx;
  4. static int[] h, e, ne;
  5. static int[] dist;
  6. public static void main(String[] args) {
  7. Scanner sc = new Scanner(System.in);
  8. n = sc.nextInt();
  9. m = sc.nextInt();
  10. h = new int[n + 1];
  11. Arrays.fill(h, -1);
  12. e = new int[m];
  13. ne = new int[m];
  14. dist = new int[n + 1];
  15. while (m-- > 0) {
  16. int a, b;
  17. a = sc.nextInt();
  18. b = sc.nextInt();
  19. add(a , b);
  20. }
  21. bfs();
  22. System.out.println(dist[n]);
  23. }
  24. static void add(int a, int b) {
  25. e[idx] = b;
  26. ne[idx] = h[a];
  27. h[a] = idx++;
  28. }
  29. static void bfs() {
  30. Arrays.fill(dist, -1);
  31. dist[1] = 0;
  32. Queue<Integer> q = new LinkedList<>();
  33. q.offer(1);
  34. while (!q.isEmpty()) {
  35. int cur = q.poll();
  36. for (int i = h[cur]; i != -1; i = ne[i]) {
  37. int j = e[i];
  38. if (dist[j] == -1) {
  39. dist[j] = dist[cur] + 1;
  40. q.offer(j);
  41. }
  42. }
  43. }
  44. }
  45. }