蓝桥杯刷题记录之蓝桥王国

博客记录蓝桥杯相关题目,提到该题使用迪杰斯特拉算法求解,且作者采用的是堆优化版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只是记录

这题用迪杰斯特拉来就行,我写的是堆优化版本


import java.util.*;

public class Main{
    static Scanner s = new Scanner(System.in);
    static int n,m,startPoint=1;
    static List<Edge>[] table;//邻接表,因为是稀疏图
    static long[] dist;
    static boolean[] used;
    public static void main(String[] args) {
        n = s.nextInt();
        m = s.nextInt();
        used = new boolean[n+1];
        dist = new long[n+1];
        table = new List[n+1];
        for(int i=0;i<=n;i++)
            table[i] = new ArrayList<>();
        for(int i=0;i<m;i++){
            int start = s.nextInt();
            int end = s.nextInt();
            long distance = s.nextLong();
            table[start].add(new Edge(end,distance));
        }
        dijkstra();
        for(int i=1;i<=n;i++){
            System.out.print(dist[i]==Long.MAX_VALUE?"-1 ":dist[i]+" ");
        }
        s.close();
    }
    static void dijkstra(){
        Arrays.fill(dist,Long.MAX_VALUE);
        dist[startPoint]=0;
        PriorityQueue<Edge> pq = new PriorityQueue<>((x,y)->x.distance.compareTo(y.distance));
        pq.add(new Edge(startPoint,0));
        while (!pq.isEmpty()){
            Edge poll = pq.poll();
            int t = poll.end;
            if(used[t])
                continue;
            used[t] = true;
            for(Edge item: table[t]){
                int vertex  = item.end;
                long distance = item.distance;
                if(!used[vertex] && dist[vertex] > dist[t]+distance){
                    dist[vertex] = dist[t]+distance;
                    pq.add(new Edge(vertex,dist[vertex]));
                }
            }
        }
    }
}
class Edge{
    int end;// 终点
    Long distance;//距离
    public Edge(int end,long distance){
        this.end = end;
        this.distance = distance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值