力扣---网络延迟时间---迪杰斯特拉,弗洛伊德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=0len_=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]=0dist[k]=0for i in range(1,n+1):min_=float("inf")jj=-1for j in range(1,n+1):if visit[j]==0 and dist[j]<min_:jj=jmin_=dist[j]if jj==-1:return -1visit[jj]=1res=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]=0for 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=0for i in range(1,n+1):res=max(res,G[k][i])if res==float("inf"):return -1return res

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

for kk in range(1,n+1)

明天继续更用Bellman Ford解决该题的解法。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java跳槽面试必备】2024年最新八股文

Java基础面试题 Java的特点 Java 与 C 的区别 JDK/JRE/JVM三者的关系 Java程序是编译执行还是解释执行&#xff1f; 面向对象和面向过程的区别&#xff1f; 面向对象有哪些特性&#xff1f; 数组到底是不是对象&#xff1f; Java的基本数据类型有哪些&#xff1f; 为什么不能用…

计算机网络:物理层 - 信道复用

计算机网络&#xff1a;物理层 - 信道复用 频分复用时分复用统计时分复用波分复用码分复用 计算机网络中&#xff0c;用户之间通过信道进行通信&#xff0c;但是信道是有限的&#xff0c;想要提高网络的效率&#xff0c;就需要提高信道的利用效率。因此计算机网络中普遍采用信道…

嵌入式学习46——硬件相关2串口通信

串口&#xff1a; 端口&#xff1a; COM 波特率&#xff1a; 9600 115200 &#xff08;bps&#xff09; 每秒传输的数据…

代码随想录算法训练营第二十二天| LeetCode235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

一、LeetCode235. 二叉搜索树的最近公共祖先 题目链接/文章讲解/视频讲解&#xff1a; https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html 状态&#xff1a;已解决 1.思路…

vue3+threejs新手从零开发卡牌游戏(十六):初始化对方手牌

添加对方手牌区时注意位置调整&#xff0c;以及手牌应该是背面朝上&#xff0c;加个rotateX翻转即可&#xff0c;其他代码和p1.vue代码一致&#xff0c;game/hand/p2.vue代码如下&#xff1a; <template><div></div> </template><script setup lan…

[windows]Windows上缩放窗体的两种方式

第一种 直接上图 第二种 第二种方式时&#xff0c;快速拖动时&#xff0c;如果是chrome浏览器套壳软件就会出现拖动部分出现黑边的现象而原生的桌面应用程序则不会出现黑边。这现象在chrome浏览器本身就存在。如图 typora是用electron写的软件存在该问题

【项目技术介绍篇】如何在本地运行若依项目

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

sql语句的常用方法以及sql语句的通用方法

SQL语句常用方法及步骤 一、sql七步曲1.七步曲2.DVD数据库中的表的设计详情&#xff1a; 二、增三、删四、改五、查六、方法优化1--非查找七、方法优化2--查找总结 一、sql七步曲 1.七步曲 1.手动加载数据库驱动类 2.获得数据库连接对象 3.写sql语句 4.获得执行对象 5.执行命…

nn.Embedding()、怎么将多句话转为vector的?

API&#xff1a; torch.nn.Embedding(num_embeddings, embedding_dim, padding_idxNone, max_normNone, norm_type2.0, scale_grad_by_freqFalse, sparseFalse, _weightNone) num_embeddings (python:int) – 词典的大小尺寸&#xff0c;比如总共出现5000个词&#xff0c;…

Overcooked!(并查集区间元素合并优化)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网登录—专业IT笔试面试备考平台_牛客网登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 5 1 1 2 3 1 2 2 2 4 3 1 4 3 2 5 输出 YES YES NO 思路&#xff1a; 根据题意&#xff0c;这…

.NET开源免费、功能强大的 Windows 截图录屏神器

前言 今天大姚给大家分享一款.NET开源免费&#xff08;基于GPL3.0开源协议&#xff09;、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器&#xff1a;ShareX。 功能特性 ShareX 是一个开源的屏幕捕捉工具&#xff0c;具有丰富的功能特性&#xff0c;包括但不限于…

内网exp对抗

内网工具对抗 首先&#xff0c;你需要分析&#xff1a; 1、安全工具是否有源代码 2、安全工具源代码逻辑复杂程度 3、当前源代码你是否有能力修改 其次&#xff0c;你需要考虑&#xff1a; 1、无源码或无能力修改 2、各种异常bug打包问题 3、修改打包后效果也不太好 故…