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

首先推荐博客:图论最短路径专题(力扣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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机投屏到windows11电脑

1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息

Linux 给网卡配置ip

ip addr | grep eth9 ifconfig eth9 10.0.0.2 netmask 255.255.255.0 up

(十三)图像的拉普拉斯梯度锐化

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

U盘位置不可用,如何轻松应对数据恢复难题

在日常工作和生活中&#xff0c;U盘作为一种便捷的存储设备&#xff0c;经常被用于数据传输和备份。然而&#xff0c;有时我们可能会遇到这样一个问题&#xff1a;当插入U盘时&#xff0c;系统提示“位置不可用”或“无法访问”&#xff0c;这让人倍感困扰。面对这种情况&#…

JavaScript:快速入门

1. 数据类型 /** * 数据类型: number(包含整数、小数) * string&#xff08;字符串类型&#xff09; * boolean&#xff08;布尔类型&#xff09; * object&#xff08;对象类型&#xff09; * function&#xff08;函数类型&#xff09; …

使用python将pdf插入到docx中

from pdf2image import convert_from_path from docx import Document from docx.shared import Inches,Cm# 将PDF转换为图片 pages convert_from_path(4.pdf, 200) # 200是DPI&#xff0c;可以根据需要调整doc Document()# 计算图片在docx中应该显示的宽度 img_width Cm(2…

单细胞RNA测序(scRNA-seq)细胞分离与扩增

单细胞RNA测序入门可以查看以下文章&#xff1a; 单细胞RNA测序&#xff08;scRNA-seq&#xff09;工作流程入门 1. 单细胞的分离 如何获得单细胞&#xff0c;从而进行下一步的测序过程&#xff1f;具体有以下几种方法&#xff1a; 一、流式细胞仪(FACS)方法 常用的方法之…

深度学习基础模型之Mamba

Mamba模型简介 问题&#xff1a;许多亚二次时间架构(运行时间复杂度低于O(n^2)&#xff0c;但高于O(n)的情况)&#xff08;例如线性注意力、门控卷积和循环模型以及结构化状态空间模型&#xff08;SSM&#xff09;&#xff09;已被开发出来&#xff0c;以解决 Transformer 在长…

LabVIEW转动设备故障诊断系统

LabVIEW转动设备故障诊断系统 随着工业自动化技术的不断进步&#xff0c;转动设备在电力、化工、船舶等多个行业中扮演着越来越重要的角色。然而&#xff0c;这些设备在长期运行过程中难免会出现故障&#xff0c;如果不能及时诊断和处理&#xff0c;将会导致生产效率下降&…

05. 【Android教程】Android 程序签名打包

在上一章&#xff0c;我们创建了自己的 Android 工程&#xff0c;并成功的在模拟器中运行起来。同时提到&#xff0c;工程目录中有一个 bin 目录&#xff0c;运行之后我们可以在此目录下找到我们的 apk。那么不难想到&#xff0c;我们在点“Run”之后&#xff0c;系统会编译我们…

[技术笔记] Flash选型之基础知识芯片分类

1、按照接口分类 分为 Serial串口Flash 和 Parallel并口Flash&#xff1b; 市场大量使用Serial Flash&#xff1b;价格便宜&#xff1b;已满足系统对数据读写速度的要求&#xff1b; Serial Flash已经可以代表 NOR Flash&#xff1b; 小知识&#xff1a; 1&#xff09;在…

深度学习算法概念介绍

前言 深度学习算法是一类基于人工神经网络的机器学习方法&#xff0c;其核心思想是通过多层次的非线性变换&#xff0c;从数据中学习表示层次特征&#xff0c;从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功&#xf…

Linux基础篇:VMware虚拟机3种常用的网络模式介绍

VMware虚拟机3种常用的网络模式介绍 VMware虚拟机提供了几种不同的网络连接模式&#xff0c;以满足不同场景下的网络需求。以下是VMware虚拟机的三种主要网络模式&#xff1a; 1.桥接模式&#xff08;Bridged Mode&#xff09;网卡名称VMnet0 桥接模式允许虚拟机直接连接到物…

鸿蒙OS开发实例:【瀑布流式图片浏览】

介绍 瀑布流式展示图片文字&#xff0c;在当前产品设计中已非常常见&#xff0c;本篇将介绍关于WaterFlow的图片浏览场景&#xff0c;顺便集成Video控件&#xff0c;以提高实践的趣味性 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型熟读Har…

解决前后端通信跨域问题

因为浏览器具有同源策略的效应。 同源策略是一个重要的网络安全机制&#xff0c;用于Web浏览器中&#xff0c;以防止一个网页文档或脚本来自一个源&#xff08;域、协议和端口&#xff09;&#xff0c;获取另一个源的数据。同源策略的目的是保护用户的隐私和安全&#xff0c;防…

PostgreSQL到Doris的迁移技巧:实时数据同步新选择!

PostgreSQL可以说是目前比较抢手的关系型数据库了&#xff0c;除了兼具多样功能和强大性能之外&#xff0c;还具备非常优秀的可扩展性&#xff0c;更重要的是它还开源&#xff0c;能火不是没有理由的。 虽然PostgreSQL很强大&#xff0c;但是它也有短板&#xff0c;相对于专业…

【Java数据结构】关于栈的操作出栈,压栈,中缀表达式,后缀表达式,逆波兰表达式详解

&#x1f525;个人主页&#xff1a;努力学编程’ &#x1f525;内容管理&#xff1a;java数据结构 上一篇文章我们讲过了java数据结构的链表&#xff0c;对于链表我们使用了它的一些基本操作&#xff0c;完成了扑克牌小游戏的操作&#xff0c;如果你感兴趣的话&#xff0c;点…

数组类模板(进阶版)

目录 介绍&#xff1a; 分析&#xff1a; 实现&#xff1a; .hpp框架创建 .hpp函数内容 有参构造 拷贝构造&#xff1a; 重载 插入数据 删除数据 通过下标访问 获取数组大小 获取数组容量 析构函数 .cpp框架 int类型数据测试 char类型测试 总代码 .hpp代码 …

是德科技keysight N9000B 信号分析仪

181/2461/8938产品概述&#xff1a; 工程的内涵就是将各种创意有机地联系起来&#xff0c;并解决遇到的问题。 CXA 信号分析仪具有出色的实际性能&#xff0c;它是一款出类拔萃、经济高效的基本信号表征工具。 它的功能十分强大&#xff0c;为一般用途和教育行业的用户执行测试…

wireshark 使用

wireshark介绍 wireshak可以抓取经过主机网卡的所有数据包&#xff08;包括虚拟机使用的虚拟网卡的数据包&#xff09;。 环境安装 安装wireshark: https://blog.csdn.net/Eoning/article/details/132141665 安装网络助手工具&#xff1a;https://soft.3dmgame.com/down/213…