首页 > 其他分享 >AcWing 1129. 热浪 (dij板子题

AcWing 1129. 热浪 (dij板子题

时间:2023-11-26 14:45:22浏览次数:29  
标签:1129 tar dij PII int static new AcWing dis

package 算法提高课;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class acw1129 {
    static class PII implements Comparable {
        int dis, tar; // tar表示我这条边的入弧, dis表示我这条边的距离
        public PII(int dis, int tar) {
            this.dis = dis;
            this.tar = tar;
        }

        @Override
        public int compareTo(Object o) {
            PII t = (PII) o;
            return this.dis - t.dis;
        }
    }

    static PriorityQueue<PII> heap = new PriorityQueue<>();

    static int[] h, e, ne, w;
    static int idx;
    static int t, c, ts, te;
    static int[] d;
    static boolean[] st;

    private static void init() {
        h = new int[t + 100]; e = new int[2 * c + 100]; ne = new int[2 * c + 100]; w = new int[2 * c + 100];
        d = new int[t + 100]; st = new boolean[t + 100];
        Arrays.fill(h, -1);
    }

    private static void add(int a, int b, int c) {
        e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx ++ ;
    }

    private static int dij(int s) {
        Arrays.fill(d, 0x3f3f3f3f);
        d[s] = 0;
        heap.add(new PII(0, s));

        while (!heap.isEmpty()) {
            PII te = heap.poll();
            int ver = te.tar, dis = te.dis;

            if (st[ver]) continue;
            st[ver] = true;

            for (int i = h[ver]; i != -1; i = ne[i]) {
                int j = e[i];
                if (d[j] > dis + w[i]) {
                    d[j] = dis + w[i];
                    heap.add(new PII(d[j], j));
                }
            }
        }

        return d[te];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        t = sc.nextInt(); c = sc.nextInt(); ts = sc.nextInt(); te = sc.nextInt();
        init();

        for (int i = 1; i <= c; i ++ ) {
            int a = sc.nextInt(), b = sc.nextInt(), w = sc.nextInt();
            add(a, b, w);
            add(b, a, w);
        }

        System.out.println(dij(ts));
    }
}

标签:1129,tar,dij,PII,int,static,new,AcWing,dis
From: https://www.cnblogs.com/llihaotian666/p/17857188.html

相关文章

  • AcWing 1128. 信使 (dij板子题 + 求花费最大的那个点的花费
    package算法提高课;importjava.util.Arrays;importjava.util.PriorityQueue;importjava.util.Scanner;publicclassacw1128{staticintn,m;staticint[]h,e,w,ne;staticint[]d;staticboolean[]st;staticintidx;staticclas......
  • AcWing 蓝桥杯 3994. 阿坤老师的独特瓷器 (非常经典俄罗斯套娃问题
    package蓝桥杯;importjava.util.Arrays;importjava.util.Scanner;publicclasslanqiao3994{/***思路:*固定套路了感觉,先按直径从大到小排,然后直径相同的再按高度从小到大排*然后从前往后遍历的时候就可以在一定存在更大d的前......
  • AcWing 3305. 作物杂交 (spfa建边变形版本
    package蓝桥杯;importjava.util.Arrays;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner;publicclasslanqiao1443{staticfinalintN=2010,M=2*100010;staticint[]h,e,ne,w,target;staticint[]dist;......
  • AcWing 903. 昂贵的聘礼 (超级源点 + 等级限制 + 抽象建图
    package算法提高课;importjava.util.Arrays;importjava.util.Scanner;publicclassacw903{staticintm,n;staticint[]dis,level;staticboolean[]st;staticint[][]g;/**思路:首先用到了虚拟源点,加入了等级限制*......
  • 对acwing193的解释
    首先是估价函数的解释由于\(x\)较大,所以\(x\)一直平方是最快的能到达\(p\)及以上的方法,所以这个估价函数比实际代价小(或等)再看\(gcd\)这个剪枝把八种情况列出,如果\(x\)和\(y\)都是\(gcd=d\)的倍数,那么加减或翻倍之后的新的\(x\)和\(y\)一定也是\(d\)的倍数,所以可以剪枝......
  • Dijkstra 算法python版
    算法策略Dijkstra算法是求一个图中一个点到其他所有点的最短路径的算法,先了解图的数据结构「邻接矩阵」Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度O(n2)B站视频:https://www.bilibili.com/vide......
  • acwing 第 130 场周赛  (前缀和,dfs,对不同边的处理)
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<climits>usingnamespacestd;typedeflonglongLL;constintN=5010;intn;inta[N];LLs[N];LLget(intl,intr){return......
  • dijkstra跑全源最短路
     跑n次voiddijk(){ for(inti=1;i<=n;i++) for(intj=1;j<=n;j++)d[i][j]=inf; priority_queue<pii,vector<pii>,greater<pii>>q; for(intS=1;S<=n;S++){ q.push(pii(0,S)); for(inti=1;i<=n;i++)......
  • AcWing 算法基础课week 1 总结(万字长文)
    AcWing算法基础课week1总结总结点1:快速排序(分治思想)题1:从小到大排序主体思路:定义一个数x属于数组s,利用双指针,将数组分为大于等于x和小于等于x的两部分,然后递归处理。(具体步骤如下)1.如上图所示,我们定义一个数组s用来储存n个数据,然后定义两个指针ij,分别指向数组的左右两......
  • Acwing.第130场周赛
    Acwing.第130场周赛比赛链接A.最大数和最小数题目链接思路:简单模拟,使用max()和min()函数就可以了代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,c; cin>>a>>b>>c; cout<<max(a,max(b,c))<<""<<min(a,min(b,c))<......