【模板】单源最短路1
您是打尖儿还是住店呢
2025年12月12日 10:17
收录于文集
共377篇

链接: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数组维护也可以,避免相同的节点重复入队。

代码块
JavaScript
自动换行
复制代码
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();
    }  
 
}
复制成功