zoukankan      html  css  js  c++  java
  • 每日一练leetcode

    网络延迟时间

    有 n 个网络节点,标记为 1 到 n。

    给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

    现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

     此题是个中等题,我用的dijkstra算法

    具体代码和实现方法见此网址

    【GTAlgorithm】图解算法,吃透一个Dijkstra就够了!C++/Java/Python - 网络延迟时间 - 力扣(LeetCode) (leetcode-cn.com)

    从一个点出发,到所有点的最短距离或最短时间,换句话就是,求源点到所有点的最短距离的最大值

    三种存图方式

    1.邻接矩阵

      当这是一种使用二维矩阵来进行存图的方式。适用于边数较多的稠密图使用,当边数量接近点的数量的平方

    时,可定义为稠密图。

    // 邻接矩阵数组:w[a][b] = c 代表从 a 到 b 有权重为 c 的边
    int[][] w = new int[N][N];
    
    // 加边操作
    void add(int a, int b, int c) {
        w[a][b] = c;
    }
    

    2.邻接表

    这也是一种在图论中十分常见的存图方式,与数组存储单链表的实现一致(头插法)。

    这种存图方式又叫链式前向星存图。

    适用于边数较少的稀疏图使用,当边数量接近点的数量,可定义为稀疏图。

    int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M];
    int idx;
    
    void add(int a, int b, int c) {
        e[idx] = b;
        ne[idx] = he[a];
        he[a] = idx;
        w[idx] = c;
        idx++;
    }
    。
    

      

    3.类

    这是一种最简单,但是相比上述两种存图方式,使用得较少的存图方式。

    只有当我们需要确保某个操作复杂度严格为 O(m) 时,才会考虑使用。

    具体的,我们建立一个类来记录有向边信息:

    class Edge {
        // 代表从 a 到 b 有一条权重为 c 的边
        int a, b, c;
        Edge(int _a, int _b, int _c) {
            a = _a; b = _b; c = _c;
        }
    }

    遍历

    List<Edge> es = new ArrayList<>();
    
    ...
    
    for (Edge e : es) {
        ...
    }
    

      

     

  • 相关阅读:
    Golang网络编程-套接字(socket)篇
    Golang并发编程-传统的同步工具"锁"实战篇
    Golang并发编程-select实战篇
    Golang并发编程-channel实战篇
    Golang并发编程-Go程(Goroutine)实战篇
    Jenkins实现简单流程部署代码
    Jenkins权限管理
    Jenkins插件管理篇
    Jenkins部署实战案例
    Golang常见的字符串函数操作实战篇
  • 原文地址:https://www.cnblogs.com/nenu/p/15175819.html
Copyright © 2011-2022 走看看