力扣---网络延迟时间---迪杰斯特拉,弗洛伊德floyd

news2024/11/24 19:34:34

首先推荐博客:图论最短路径专题(力扣743、5888)_力扣 最短路径-CSDN博客 

迪杰斯特拉算法:

太久没有做图论的题了,,临时抱佛脚。。

这道题可以转化为max{点x到点k的距离}。因为带权图(权值为正),无环,求最短路径的情况,迪杰斯特拉分为两个步骤:首先是初始化数组(G:二维数组,记录初始时刻点与点之间的距离,dist:每个点距k点的距离,visit:每个点是否已经确认距k点的距离)。第二部是一个大循环,即将n个点全部更新距k点的距离。再循环中,分为三个小步骤:第一点是寻找距k点距离最短的点(且该点距离k的距离还没有确定),第二点是将该点放入已知距k点距离的集合内(即visit[jj]=1),第三点是更新jj临近的那些点(距离k的距离还没有确定)距离k点的值。

参考PPT:

代码:

C++:

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        int inf=INT_MAX;
        vector<vector<int>> G(n+1,vector<int>(n+1,inf));
        vector<int> dist(n+1,inf);//k距离其他结点的距离
        vector<int> visit(n+1,0);//结点x是否已经确定最短距离
        int res=0;
        /*初始化*/
        int len=times.size();
        for(int i=0;i<len;i++){
            G[times[i][0]][times[i][1]]=times[i][2];
        }
        for(int i=1;i<=n;i++){
            G[i][i]=0;
        }
        dist[k]=0;

        
        /*正式迪杰斯特拉*/ //要更新n个结点
        for(int i=1;i<=n;i++){
            int min=INT_MAX;
            int jj=-1;
            /*找到距离k最短的距离*/
            for(int j=1;j<=n;j++){
                if(visit[j]==0 && dist[j]<min){
                    jj=j;
                    min=dist[j];
                }
            }
            /*visit[]*/
            if(jj==-1){return -1;}
            visit[jj]=1;
            res=max(res,min);
            /*更新以jj为头结点的距离*/
            for(int j=1;j<=n;j++){
                if(G[jj][j]!=INT_MAX && visit[j]==0 && dist[j]>dist[jj]+G[jj][j]){
                    dist[j]=dist[jj]+G[jj][j];
                }
            }
        }
        return res;
    }
};

Python:

class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        G=[[float("inf") for _ in range(n+1)] for _ in range(n+1)]
        dist=[float("inf")]*(n+1)
        visit=[0]*(n+1)
        res=0
        len_=len(times)
        for i in range(len_):
            G[times[i][0]][times[i][1]]=times[i][2]

        for i in range(1,n+1):
            G[i][i]=0

        dist[k]=0

        for i in range(1,n+1):
            min_=float("inf")
            jj=-1
            for j in range(1,n+1):
                if visit[j]==0 and dist[j]<min_:
                    jj=j
                    min_=dist[j]

            if jj==-1:
                return -1
            visit[jj]=1
            res=max(res,min_)

            for j in range(1,n+1):
                if G[jj][j]!=float("inf") and visit[j]==0 and dist[j]>dist[jj]+G[jj][j]:
                    dist[j]=dist[jj]+G[jj][j]
        return res

Floyd算法:

Floyd算法不能有环,允许有带负权值的边,但不允许有包含带负权值的边组成的回路
采用动态规划的思想,用结点k来更新结点i,j之间的距离:G[i][j]=?=G[i][k]+G[k][j],用三层for循环来实现

参考PPT:

代码:

C++:

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        int inf=INT_MAX/2;
        vector<vector<int>> G(n+1,vector<int>(n+1,inf));
        /*初始化*/
        int len=times.size();
        for(int i=0;i<len;i++){
            G[times[i][0]][times[i][1]]=times[i][2];
        }
        for(int i=1;i<=n;i++){
            G[i][i]=0;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(G[i][j]>G[i][k]+G[k][j]){
                        G[i][j]=G[i][k]+G[k][j];
                    }
                }
            }
        }

        /*求结果*/
        int res=0;
        for(int i=1;i<=n;i++){
            res=max(res,G[k][i]);
        }
        if(res==INT_MAX/2){return -1;}
        return res;
    }
};

Python:

class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        G=[[float("inf") for _ in range(n+1)] for _ in range(n+1)]
        
        len_=len(times)
        for i in range(len_):
            G[times[i][0]][times[i][1]]=times[i][2]

        for i in range(1,n+1):
            G[i][i]=0

        for kk in range(1,n+1):
            for i in range(1,n+1):
                for j in range(1,n+1):
                    if G[i][j]>G[i][kk]+G[kk][j]:
                        G[i][j]=G[i][kk]+G[kk][j]
        res=0
        for i in range(1,n+1):
            res=max(res,G[k][i])
        if res==float("inf"):
            return -1
        return res

注意是,应该是:(不要用k哦)

for kk in range(1,n+1)

Bellman Ford算法:

该算法用于在带权图中(可以有负权边)找到从单一源点到所有其他顶点的最短路径,也可以检测是否有负权环
检测负环的原理基于这样一个事实:在一个包含n个顶点的图中,任何两个顶点之间的最短路径最多包含n-1条边。因此,Bellman-Ford算法的基本步骤包括对所有边重复进行n-1次松弛操作。松弛操作即:

if(res[a]!=INT_MAX && res[a]+w<res[b]){
    res[b]=res[a]+w;
}

代码:

C++:

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        vector<int> res(n+1,INT_MAX);
        res[k]=0;
        int len=times.size();
        /*n-1次松弛操作*/
        for(int i=1;i<=n-1;i++){
            for(int j=0;j<len;j++){
                int a=times[j][0];
                int b=times[j][1];
                int w=times[j][2];
                if(res[a]!=INT_MAX && res[a]+w<res[b]){
                    res[b]=res[a]+w;
                }
            }
        }
        int fin=0;
        for(int i=1;i<=n;i++){
            fin=max(fin,res[i]);
        }
        if(fin==INT_MAX){return -1;}
        return fin;
    }
};

Python:

class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        res=[0x3f3f3f3f]*(n+1)
        res[k]=0
        len_=len(times)

        for i in range(1,n):
            for j in range(len_):
                a=times[j][0]
                b=times[j][1]
                w=times[j][2]
                if res[a]!=0x3f3f3f3f and res[a]+w<res[b]:
                    res[b]=res[a]+w
        fin=0
        for i in range(1,n+1):
            fin=max(fin,res[i])
        if fin==0x3f3f3f3f:
            return -1
        return fin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[超详细]3种方法判断一个数是否为质数(Python)

(发现好多博客对第三种进阶方法说的不明白&#xff0c;至少我是没完全看明白。后面结合自己的理解应该算是弄懂了&#xff0c;供大家参考&#xff0c;欢迎纠正。) 方法一&#xff1a;最暴力&#xff0c;最简单&#xff0c;也最耗时O(n) 思想&#xff1a;由素数的定义&#xf…

arcgis 无法编辑元素的解决办法(无法删除元素或者缺失值替换)

打开“编辑器”中&#xff0c;“开始编辑”即可进行元素编辑&#xff0c;也可进行缺失值替换 &#xff08;其他方式&#xff1a;选中图层&#xff0c;右击点击开始编辑&#xff09; 在元素编辑状态下无法删除变量&#xff0c;可以删除元素 元素编辑结束后 点击“编辑器”&…

深入剖析Spring WebFlux:从MethodHandler到反射获取请求信息的源码之旅

文章目录 前言一、获取请求执行的类、方法信息二、获取请求url变量三、获取请求处理数据总结 前言 最近想写一个代办事项后台服务&#xff0c;底层&#xff0c;选型WebFlux。在操作层面上&#xff0c;针对部分操作&#xff0c;想在不侵入业务代码的前提下&#xff0c;记录操作…

使用 Seq2Seq 模型进行文本摘要

目录 引言 1 导入数据集 2 清洗数据集 3 确定允许的最大序列长度 4 选择合理的文本和摘要 5 对文本进行标记 6 删除空文本和摘要 7 构建模型 7.1 编码器 7.2 解码器 8 训练模型 9 测试模型 10 注意 11 整体代码 引言 文本摘要是指在捕捉其本质的同时缩短长文本的…

主从复制与读写分离

前言&#xff1a; 在企业应用中&#xff0c;成熟的业务通常数据量都比较大&#xff0c;单台MySQL在安全性、高可用性和高并发方面 都无法满足实际的需求&#xff1f; 配置多台主从数据库服务器以实现读写分离 目录 一 主从复制的工作原理 ①MySQL的复制类型 ②主从复制过…

Netty组件优化之FastThreadLocal

ThreadLocal:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132995427 Netty中的FastThreadLocal是对Java中的FastThreadLocal的优化主要是为了解决ThreadLocal中线性查找 带来的性能下降同时实现快速查找和赋值 FastThreadLocal构建这里的index代表一个编号&#xff0c;从…

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

预训练大模型最佳Llama开源社区中文版Llama2

Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代。 作为AI领域最强大的开源大模型&#xff0c;Llama2基于2万亿token数据预…

[机器学习]练习闵可斯基距离

闵可斯基距离&#xff08;Minkowski distance&#xff09;是一种用于衡量向量空间中两点之间距离的方法。它是曼哈顿距离和欧几里得距离的一般化形式。闵可斯基距离使用一个参数 p 来调整计算方法&#xff0c;其中 p 是一个大于 0 的实数值。 在二维空间中&#xff0c;闵可斯基…

二. CUDA编程入门-Stream与Event

目录 前言0. 简述1. 执行一下我们的第九个CUDA程序2. Stream是什么3. Streams实验(单流vs多流)4. 如何隐藏延迟(memory)5. 如何隐藏延迟(kernel)6. 如何隐藏延迟(kernelmemory)7. 代码分析总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记…

HWOD:提取不重复的整数

一、题目 1、描述 输入一个int型整数&#xff0c;按照从右向左的阅读顺序&#xff0c;返回一个不含重复数字的新的数字。保证输入的整数最后一位不是0 2、数据范围 1< n <10^8&#xff1b; 3、输入 输入一个int型整数 4、输出 按照从右向左的阅读顺序&#xff0c…

vue3 视频播放功能整体复盘梳理

回顾工作中对视频的处理&#xff0c;让工作中处理的问题的经验固化成成果&#xff0c;不仅仅是完成任务&#xff0c;还能解答任务的知识点。 遇到的问题 1、如何隐藏下载按钮&#xff1f; video 标签中的controlslist属性是可以用来控制播放器上空间的显示&#xff0c;在原来默…

文件上传失败原因分析与解决

图片文件上传失败 问题描述&#xff1a;在前端开发时&#xff0c;需要通过表单元素上传图片或其他文本&#xff0c;但是上传不成功&#xff0c;后端接口也没问题 html <!--onChange用来绑定数据 handleUpload用来提交数据--><form onSubmit{handleUpload}><…

比KMP简单的Manacher

P3805 【模板】manacher - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) “没时间悼念KMP了&#xff0c;接下来上场的是Manacher&#xff01;” 什么是Manacher? 历史背景&#xff1a; 1975 年&#xff0c;一个叫 Manacher 的人发明了这个算法&#xff0c;所以叫Manacher 算…

npm镜像源证书过期问题解决

title: npm镜像源证书过期 search: 2024-02-29 文章目录 Failed to check for updates 问题ERR_PNPM_NO_PKG_MANIFESTnpm缓存清除指令权限不足导致删除不了解决方案npm创建基础配资文件 Failed to check for updates 问题 错误描述如上 检查完 node,vue,npm 的版本后都没啥问…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求&#xff0c;添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

Linux:ip协议

文章目录 ip协议基本认识ip协议的报头 ip协议基本认识 前面对于TCP的内容已经基本结束了&#xff0c;那么这也就意味着在传输层也已经结束了&#xff0c;那么下一步要进入的是的是网络层&#xff0c;网络层中也有很多种协议&#xff0c;这里主要进行解析的是ip协议 前面的TCP…

【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

1. 问题背景 客户使用 BlueNRG-345MC 开发了一个 BLE 外设&#xff0c;和手机连接。在测试中发现&#xff0c;手机连接上外设之后&#xff0c;不断地在手机上点击蓝牙的开关按钮&#xff0c;造成设备不断地断开、重连&#xff1b;少则几次&#xff0c;多则几十次。点击之后&am…

【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期中在什么时期给接口发请求、【找出数组最大公约数】

一、vue2和vue3的区别 1.性能优化&#xff1a; Vue 3在性能方面有很大的提升&#xff0c;主要是通过虚拟DOM的优化和响应式系统的改进实现的。 虚拟 DOM 重构&#xff1a;Vue 3 中对虚拟 DOM 进行了重构&#xff0c;使得更新算法更加高效&#xff0c;减少了更新时的开销&#x…

【电路笔记】-快速了解数字逻辑门

快速了解数字逻辑门 文章目录 快速了解数字逻辑门1、概述2、集成电路的分类3、摩尔定律4、数字逻辑状态5、数字逻辑噪声6、简单的基本数字逻辑门7、基本 TTL 逻辑门8、发射极耦合数字逻辑门9、集成电路的“74”子族10、基本 CMOS 数字逻辑门数字逻辑门是一种电子电路,它根据其…