题解 | #【模板】单源最短路1#

【模板】单源最短路1

https://www.nowcoder.com/practice/f24504c9ff544f7c808f76693cc34af8

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static class Enter {
         int id;
         int weight;
        public Enter(int id, int weight) {
            this.id = id;
            this.weight = weight;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer st  = new StreamTokenizer(br);
        st.nextToken();
        int n = (int)st.nval;
        st.nextToken();
        int m = (int)st.nval;
        HashMap<Integer, List<Enter>> map = new HashMap<>();
        for (int i = 0;  i < m; i++) {
            st.nextToken();
            int a = (int)st.nval;
            st.nextToken();
            int b = (int)st.nval;
            if (!map.containsKey(a)) {
                map.put(a, new ArrayList<>());
            }
            if (!map.containsKey(b)) {
                map.put(b, new ArrayList<>());
            }
            map.get(a).add(new Enter(b, 1));
            map.get(b).add(new Enter(a, 1));
        }
        //利用堆优化
        PriorityQueue<Enter> heap = new PriorityQueue<>(Comparator.comparingInt(
                    a -> a.weight));
        heap.addAll(map.get(1));
        //HashSet保存可达的路径序列(去重)
        HashSet<Integer> set = new HashSet<>();
        int flag = -1;
        set.add(1);
        //主逻辑(还可以继续优化,在主逻辑前先判断heap中是否有Enter(n,1),在可以直达的情况下避免进去主逻辑的不必要情况)
        while (!heap.isEmpty()) {
            Enter e = heap.poll();
            if (e.id == n) {
                System.out.println(e.weight);
                flag = 0;
                break;
            }
            set.add(e.id);
            if (map.containsKey(e.id)) {
                for (Enter next : map.get(e.id)) {
                    if (!set.contains(next.id)) {
                        heap.add(new Enter(next.id, e.weight + next.weight));
                    }
                }
            }
        }
        if(flag==-1) System.out.println(-1);
    }
}

全部评论

相关推荐

01-29 16:08
已编辑
华南农业大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务