链接:https://ac.nowcoder.com/acm/problem/226492 来源:牛客网
给你一个无向图,图中包含 5000 个点 m 个边,任意两个点之间的距离是 1 ,无重边或自环。请求出1号点到n号点的最短距离。
注意:图中可能存在孤立点,即存在点与任意点都没有边相连
如果1号点不能到达n号点,输出-1.
第一行两个整数n和m,表示图的点和边数。
接下来m行,每行两个整数u,v,表示u到v有一条无向边。
1≤n≤5000
输出一行,表示1到n的最短路,如不存在,输出-1.
示例1
4 4
1 2
2 4
3 4
3 1
2
示例2
4 3
1 2
2 3
3 1
-1
1号点不能到4号点。
bfs,bfs的时候需要加vis数组,或者用一个dist数组维护也可以,避免相同的节点重复入队。
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;
import java.util.Queue;
public class Niudaily{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
List<Integer>[]grid=new ArrayList[n+1];
for (int i = 0; i < grid.length; i++) {
grid[i]=new ArrayList<>();
}
int m=sc.nextInt();
boolean[]vis=new boolean[n+1];
int[]dist=new int[n+1];
for (int i = 0; i < m; i++) {
int from=sc.nextInt();
int to=sc.nextInt();
grid[from].add(to);
grid[to].add(from);
}
vis[1]=true;
Queue<int[]>que=new ArrayDeque<>();
que.add(new int[]{1,0});
while (!que.isEmpty()) {
int[]cur=que.poll();
int from=cur[0];
int d=cur[1];
for (int next : grid[from]) {
if(!vis[next]){
int newd=d+1;
vis[next]=true;
dist[next]=newd;
que.add(new int[]{next,newd});
}
}
}
System.out.println(dist[n]==0?-1:dist[n]);
sc.close();
}
}