首页 > 其他分享 >最短路题单 - 1

最短路题单 - 1

时间:2024-03-21 18:29:17浏览次数:20  
标签:dist int double 短路 start new dis 题单

floyed

题目:. - 力扣(LeetCode)

AC代码:

class Solution {
    int[][] g;
    
    public int networkDelayTime(int[][] times, int n, int k) {
        g = new int[n + 1][n + 1];
​
        for(int i = 0;i<=n;i++){
            for(int j = 0;j<=n;j++){
                if(i == j) g[i][j] = 0;
                else g[i][j] = 0x3f3f3f3f;
            }
        }
​
        for(var t : times){
            int a = t[0], b = t[1], w = t[2];
            g[a][b] = Math.min(g[a][b],w);
            // g[b][a] = Math.min(g[b][a],w);
        }
        // floyed 
        for(int p = 1;p<=n;p++){
            for(int i = 1;i<=n;i++){
                for(int j = 1;j<=n;j++){
                    g[i][j] = Math.min(g[i][j],g[i][p] + g[p][j]);
                }
            }
        }
        int res = 0;
        for(int i = 1;i<=n;i++){
            res = Math.max(res,g[k][i]);
        }
        if(res == 0x3f3f3f3f) return -1;
        return res;
    }
}

Dijkstra

题目:. - 力扣(LeetCode)

AC代码:

堆优化-邻接表版

class Solution {
    public double maxProbability(int n, int[][] edges, double[] succProb, int start_node, int end_node) {
        double[] dist = new double[n];
        List<double[]>[] g = new ArrayList[n];
        Arrays.setAll(g,e -> new ArrayList<>());
        boolean[] st = new boolean[n];
        Arrays.fill(dist,0);
​
        int m = edges.length;
        for(int i = 0;i<m;i++){
            var t = edges[i];
            g[t[0]].add(new double[]{t[1],succProb[i]});
            g[t[1]].add(new double[]{t[0],succProb[i]});
        }
        
        PriorityQueue<double[]> heap = new PriorityQueue<>((a,b) ->Double.compare(a[0], b[0]));
        heap.add(new double[]{start_node,1});
        dist[start_node] = 1;
​
        while(!heap.isEmpty()){
            var p = heap.poll();
            int u = (int)p[0];
            double t = p[1];
            if(t < dist[u]) continue;
​
            for(var ne : g[u]){
                int v = (int)ne[0];
                double c = ne[1];
                if(c * t > dist[v]){
                    dist[v] = c * t;
                    heap.offer(new double[]{v,c * t});
                }
            }
        }
        return dist[end_node];
    }
}

朴素-邻接矩阵版

但是注意这里这样得话会发生超出内存限制得错误,g 临界矩阵的所需内存太大了。

class Solution {
    double[] dist;  // 记录从 start到其他点的概率
    double[][] g;
    boolean[] st;
    public double maxProbability(int n, int[][] edges, double[] succProb, int start_node, int end_node) {
        dist = new double[n];
        g = new double[n][n];
        st = new boolean[n];
        Arrays.fill(dist,0);
        // for(var t :g){
        //     for(int i = 0;i<t.length;i++)
        //         t[i] = (double)0;
        // }
​
        int m = edges.length;
        for(int i = 0;i<m;i++){
            var t = edges[i];
            g[t[0]][t[1]] = succProb[i];
            g[t[1]][t[0]] = succProb[i];
        }
        for(int i = 0;i<n;i++) dist[i] = g[start_node][i];
        dijkstra(n,start_node,end_node);
        return dist[end_node];
​
    }
    // dijkstra 计算 从start 到 end 最大概率
    public void dijkstra(int n, int start,int end){
        dist[start] = 1;
        st[start] = true;
        // 寻找最大概率
        for(int i = 1;i<n;i++){
            int t = -1;
            for(int j = 0;j<n;j++){
                if(!st[j] && (t == -1 || dist[j] > dist[t]))
                    t = j;
            }        
            // 更新其他点
            for(int j = 0;j<n;j++){
                dist[j] = Math.max(dist[j],dist[t] * g[t][j]);
            }
            st[t] = true;
        }
    }
}

题目:. - 力扣(LeetCode)

Graph 图

addEdge为新增加权边

shortestPath 计算start到end的最小路径长度

class Graph {
    private static final int INF = Integer.MAX_VALUE / 2; // 防止更新最短路时加法溢出
​
    private int[][] g;
​
    public Graph(int n, int[][] edges) {
        g = new int[n][n]; // 邻接矩阵(初始化为无穷大,表示 i 到 j 没有边)
        for (int i = 0; i < n; ++i)
            Arrays.fill(g[i], INF);
        for (var e : edges)
            g[e[0]][e[1]] = e[2]; // 添加一条边(输入保证没有重边)
    }
​
    public void addEdge(int[] e) {
        g[e[0]][e[1]] = e[2]; // 添加一条边(输入保证这条边之前不存在)
    }
​
    // 朴素 Dijkstra 算法
    public int shortestPath(int start, int end) {
        int n = g.length;
        var dis = new int[n]; // 从 start 出发,到各个点的最短路,如果不存在则为无穷大
        Arrays.fill(dis, INF);
        dis[start] = 0;
        var vis = new boolean[n];
        for (;;) {
            // 找到当前最短路,去更新它的邻居的最短路
            // 根据数学归纳法,dis[x] 一定是最短路长度
            int x = -1;
            for (int i = 0; i < n; ++i)
                if (!vis[i] && (x < 0 || dis[i] < dis[x]))
                    x = i;
            if (x < 0 || dis[x] == INF) // 所有从 start 能到达的点都被更新了
                return -1;
            if (x == end) // 找到终点,提前退出
                return dis[x];
            vis[x] = true; // 标记,在后续的循环中无需反复更新 x 到其余点的最短路长度
            for (int y = 0; y < n; ++y)
                dis[y] = Math.min(dis[y], dis[x] + g[x][y]); // 更新最短路长度
        }
    }
}

标签:dist,int,double,短路,start,new,dis,题单
From: https://blog.csdn.net/a1783760364/article/details/136849087

相关文章

  • 安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】
    开发背景过去几年智慧用电的产品应用中,大多数只安装于进线测。主要存在以下几个问题:难定位,不知道具体哪个回路出线问题,排查困难;出线过载或线缆温度过高无法知晓;即使是出线回路安装了的场景,因后端多数是微断,回路多,而且空间有限,导致安装困难,或者重新加箱子增加成本。接线繁多(电......
  • 洛谷题单指南-集合-P1102 A-B 数对
    原题链接:https://www.luogu.com.cn/problem/P1102题意解读:前文https://www.cnblogs.com/jcwy/p/18043197介绍了二分和双指针的做法,本文介绍hash的做法。解题思路:定义map<int,int>h,保存每个数+c出现的个数同样,先将所有数由小到大哦排序遍历每一个数x,答案累加ans+=h[x]然......
  • 洛谷题单指南-集合-P5266 【深基17.例6】学籍管理
    原题链接:https://www.luogu.com.cn/problem/P5266题意解读:本题考察map的应用。解题思路:直接使用map即可解题。100分代码:#include<bits/stdc++.h>usingnamespacestd;map<string,int>h;stringname;intn,op,score;intmain(){cin>>n;while(n--)......
  • 洛谷题单指南-集合-P5250 【深基17.例5】木材仓库
    原题链接:https://www.luogu.com.cn/problem/P5250题意解读:根据题目要求,需要一种数据结构,支持去重、排序、logN的查找,set是最合适的。解题思路:先回顾一下set的关键操作:设set<int>s;1、添加:s.insert(x)2、查询个数:s.count(x)3、查找第一个>=x的元素,返回迭代器:set<int>::iter......
  • 最短路径算法
    原文链接:https://blog.csdn.net/xiaoxi_hahaha/article/details/110257368已知起始结点,求最短路径的问题。适合使用Dijkstra算法。迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。它是一个贪心算法。全......
  • 数据结构:图的最短路径
    一、最短路径的基本概念无权图:路径包含的边的条数。带权图:路径包含的各边权值之和。长度最小的路径称为最短路径,最短路径的长度也称为最短距离。二、无权图单源最短路径        无权图单源最短路径使用BFS求出,时间复杂度为O(n+e)。该算法可以求出单源到所有顶点的......
  • 洛谷题单指南-集合-P3370 【模板】字符串哈希
    原题链接:https://www.luogu.com.cn/problem/P3370题意解读:本题要求理解哈希的原理,自行建立哈希表解题,如果直接使用map,就不推荐。解题思路:先介绍哈希的原理1、什么是哈希?什么是哈希表?先从一个问题出发:给定不超过105个整数(取值1~109),要统计不重复整数的数量。首先,如果取值范围......
  • 洛谷题单指南-集合-P1536 村村通
    原题链接:https://www.luogu.com.cn/problem/P1536题意解读:城镇之间现有的道路关系可以将城镇划分的若干集合,每个集合内的城镇是互通的,要计算最少增加多少条道路,使得每个集合都相通。解题思路:利用并查集,统计一共出现多少个集合,即p[i]=i的数量,最少的道路数即集合数-1,即可把所......
  • 洛谷题单指南-集合-P1551 亲戚
    原题链接:https://www.luogu.com.cn/problem/P1551题意解读:要判断两人是否是亲戚,只需要看两人是否属于一个集合,基于所有已知的亲戚关系,可以建立多个有亲戚关系的集合,这个过程可以借助并查集。解题思路:并查集:1、定义并查集是一种树形数据结构,本质上是多棵树,每棵树表示一个集合,......
  • A_Star算法无人机威胁概率地图避障三维航迹规划(目标函数:最短路径)【含Matlab源码 4115
    ......