lintcode 1057 · 网络延迟时间 【图,BFS,中等】

news/2024/6/29 12:02:41 标签: 宽度优先, 算法

题目链接,描述

https://www.lintcode.com/problem/1057

N个网络节点,从 1N标记.

给定 times,一个旅行时间和有向边列表 times[i] = (u, v, w),其中u 是起始点, v是目标点, w是一个信号从起始到目标点花费的时间。

现在,我们从一个特定节点 K发出信号,所有节点收到信号需要花费多长时间? 如果不可能,返回-11.N 是 [1, 100]内的整数.
2.K 位于 [1, N]范围内.
3. times 的长度在范围 [1, 6000].
4. 所有边 times[i] = (u, v, w) 将会有 1 <= u, v <= N 以及1 <= w <= 100.

样例
样例 1:
	输入:  times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
	输出:  2

样例 2:
	输入: times = [[1,2,1],[1,2,2]], N = 2, K = 1
	输出:  1

	解释:
	两条路选择最短的。

思路

SPFA: 首先,bfs也可以用来做有向图,边长不固定的最短路径
这个题里面,关键是bfs要把所有的路径都走一遍,并记录到达当前点的最小值是什么。
如果到达当前点的cost比之前记录的cost低,那么就再放到queue里面。这种方法叫什么pfsa之类的。
反正记住一点,bfs继续走下去,值更小的时候更新值,并再放到queue里面。
最后把所有的cost都看一遍,找到其中的最大值。

代码

public class Solution {
    /**
     * @param times: a 2D array
     * @param n: an integer
     * @param k: an integer
     * @return: how long will it take for all nodes to receive the signal
     */
    public int networkDelayTime(int[][] times, int n, int k) {
         // SPFA
        /*
        首先,bfs也可以用来做有向图,边长不固定的最短路径
        这个题里面,关键是bfs要把所有的路径都走一遍,并记录到达当前点的最小值是什么。
        如果到达当前点的cost比之前记录的cost低,那么就再放到queue里面。这种方法叫什么pfsa之类的。
        反正记住一点,bfs继续走下去,值更小的时候更新值,并再放到queue里面。
        最后把所有的cost都看一遍,找到其中的最大值。
         */
      Map<Integer,Set<Info>> graph = new HashMap<>();
        for (int[] arr : times) {
            int a= arr[0],b=arr[1],c=arr[2];
            if(!graph.containsKey(a))
                graph.put(a,new HashSet<>());
            graph.get(a).add(new Info(b,c));
        }

        Map<Integer,Integer> distances = new HashMap<>();
        Queue<Integer> queue = new LinkedList<>();
        queue.add(k);
        distances.put(k,0);

        while (!queue.isEmpty()){
            int cur= queue.poll();
            int curdis = distances.get(cur);
            if(!graph.containsKey(cur))
                continue;

            for(Info next: graph.get(cur)){
                if(!distances.containsKey(next.data) || next.dis+curdis < distances.get(next.data)){
                    distances.put(next.data,next.dis+curdis);
                    queue.add(next.data);
                }
            }
        }

        if(distances.size()!=n)
            return -1;

        int ans =0;
        for(int dis: distances.values()){
            ans=Math.max(ans,dis);
        }
        return ans;
    }

    static class Info {
        int data;
        int dis;

        public Info(int d, int d1) {
            data = d;
            dis = d1;
        }
    }

}

http://www.niftyadmin.cn/n/4974131.html

相关文章

Lalamu-免费视频口型同步工具,创建属于你自己的虚拟数字人

什么是Lalamu? Lalamu 是一款视频口型同步应用程序。该应用程序由 Lalamu Entertainment 开发&#xff0c;允许用户对视频中的任何面孔进行口型同步。无论是人物、人体模型、书籍封面、艺术品、演员、婴儿、蜡像&#xff0c;甚至银行账单上的面孔&#xff0c;Lalamu 都可以让…

springboot之@Async异步定时任务自定义线程池

在应用中经常会遇到定时执行任务的需求&#xff0c;这时采用异步的方式开启一个定时任务&#xff0c;通常引用Async注解&#xff0c;但直接使用会有风险&#xff0c;当我们没有指定线程池时&#xff0c;会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池&#xff0c;会…

AUTOSAR规范与ECU软件开发(实践篇)6.3 CAN通信协议栈概念与配置方法介绍

目录 1 、CAN通信协议栈概念 2、 CAN通信协议栈配置方法 (1) EcuC模块 (2) Com模块

今天不想学习

【深基16.例1】淘汰赛 - 洛谷 根据队列知识&#xff0c;和巧用题目信息&#xff0c;代码都很简单哈哈哈&#xff0c;因为我会的不多 #include<iostream> #include<queue> #include<map> using namespace std; #define int long long int n,num1; signed ma…

【2023年11月第四版教材】《第8章-整合管理》(第2部分)

《第8章-整合管理》&#xff08;第2部分&#xff09; 5 制定项目章程5.1 项目章程★★★5.2 立项管理文件5.3 数据收集5.4 人际关系与团队技能5.5 项目章程★★★ &#xff08;10上/15上/16上案例&#xff09; 6 制定项目管理计划6.1 项目管理计划★★★6.2 数据收集6.3 项目管…

《网络是怎样连接的》(五)

本文主要取材于 《网络是怎样连接的》 第五章。 目录 5.1 Web服务器的部署地点 5.2 防火墙的结构和原理 5.3服务器负载平衡 5.4 使用缓存服务器分担负载 5.5 内容分发服务 简述&#xff1a;本文主要内容是解释 网络包如何朝服务器前进&#xff0c;并通过服务器前面的防…

pandas由入门到精通-pandas的数据结构

pandas数据分析-pandas的数据结构 pandas 数据结构Series1. 创建Series数组2. 性质3. 索引4. 运算DataFrame1. 创建Df数组2. 性质3.索引4. 对列进行增删改Index Objects本文介绍pandas中一些常用的属性方法的概述,给读者提供快速学习的架构和思路。表格中提供的一些参数方法没…

Linux操作系统--shell编程(条件判断)

(1).基本的语法 test condition [ condition ] 注意condition前后要有空格;在使用该种表达式的时候,条件非空即为 true,[ hello ]返回 true,[ ] 返回 false。我们可以通过echo $?来判断上一次执行的情况来判断真假(0真1假)。