Java最短路径问题知识点(含面试大厂题和源码)

最短路径问题是图论中的一个经典问题,它寻找图中两点之间的最短路径。这个问题在现实世界中有广泛的应用,比如导航系统中的路线规划、网络中的信息传输等。解决最短路径问题有多种算法,其中最著名的包括:

  1. 贝尔曼-福特算法(Bellman-Ford):可以处理带有负权边的图,通过迭代松弛操作计算从单一源点到所有其他顶点的最短路径。

  2. 迪杰斯特拉算法(Dijkstra’s Algorithm):适用于没有负权边的图,使用贪心策略和优先队列(或二叉堆)来找到单源最短路径。

  3. 弗洛伊德算法(Floyd-Warshall):计算所有顶点对之间的最短路径,适用于密集图。

  4. A*搜索算法:结合了迪杰斯特拉算法和启发式搜索,常用于图搜索和路径规划问题,特别是在有明确目标的情况下。

贝尔曼-福特算法的Java实现:

public class BellmanFord {public int[] bellmanFord(int n, int[][] edges, int src) {int[] dist = new int[n];Arrays.fill(dist, Integer.MAX_VALUE);dist[src] = 0;for (int i = 0; i < n - 1; i++) {for (int[] edge : edges) {int u = edge[0], v = edge[1], weight = edge[2];if (dist[u] != Integer.MAX_VALUE && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;}}}// 检测负权环for (int[] edge : edges) {if (dist[edge[0]] != Integer.MAX_VALUE && dist[edge[0]] + edge[2] < dist[edge[1]]) {throw new IllegalArgumentException("Graph contains a negative-weight cycle");}}return dist;}public static void main(String[] args) {BellmanFord bf = new BellmanFord();int n = 5;int[][] edges = {{0, 1, -1}, {0, 2, 4}, {1, 2, 3}, {1, 3, 2}, {1, 4, 2}, {3, 4, -5}};int src = 0;int[] dist = bf.bellmanFord(n, edges, src);System.out.println("Single source shortest path distances: " + Arrays.toString(dist));}
}

迪杰斯特拉算法的Java实现:

import java.util.PriorityQueue;public class Dijkstra {public int[] dijkstra(int n, int[][] edges, int src) {int[] dist = new int[n];Arrays.fill(dist, Integer.MAX_VALUE);dist[src] = 0;PriorityQueue<int[]> pq = new PriorityQueue<>(n, (a, b) -> a[1] - b[1]);pq.offer(new int[]{src, 0});while (!pq.isEmpty()) {int[] curr = pq.poll();int node = curr[0], weight = curr[1];if (weight == dist[node]) {for (int[] edge : edges) {if (node == edge[0]) {int nextNode = edge[1], edgeWeight = edge[2];pq.offer(new int[]{nextNode, dist[node] + edgeWeight});}}}}return dist;}public static void main(String[] args) {Dijkstra dijkstra = new Dijkstra();int n = 5;int[][] edges = {{0, 1, 10}, {0, 2, 4}, {1, 2, 3}, {1, 3, 2}, {1, 4, 2}, {3, 4, 5}};int src = 0;int[] dist = dijkstra.dijkstra(n, edges, src);System.out.println("Single source shortest path distances: " + Arrays.toString(dist));}
}

面试大厂题示例:

  1. 单源最短路径
    描述:给定一个加权图,找到从单一源点到所有其他顶点的最短路径。

  2. 带有负权边的最短路径
    描述:给定一个带有负权边的图,找到从单一源点到所有其他顶点的最短路径。

  3. 检测负权环
    描述:给定一个图,使用一种算法检测图中是否存在负权环。

  4. 所有顶点对的最短路径
    描述:给定一个图,找到所有顶点对之间的最短路径。

  5. 最短路径计数
    描述:给定一个无向无权图,计算从源点到每个顶点的最短路径数量。

在面试中,最短路径问题是考察候选人对图算法和动态规划理解的常见方式。通过实现最短路径算法,可以展示你对算法设计和优化的掌握程度。希望这些示例能够帮助你更好地准备面试!最短路径问题在大厂面试中经常出现,因为它们考察了应聘者对图算法的理解和实现能力。以下是三道与最短路径相关的面试题目,以及相应的Java源码实现。

题目 1:单源最短路径

描述
给定一个加权有向图,找到从单一源点到所有其他顶点的最短路径。

示例

输入:图的邻接矩阵表示,源点为 0
[[0, 4, 0, 0, 0],[4, 0, 8, 0, 0],[0, 8, 0, 5, 0],[0, 0, 5, 0, 10],[0, 0, 0, 10, 0]
]
输出:最短路径长度数组 [0, 4, 8, 3, 9]

Java 源码(使用Dijkstra算法):

import java.util.PriorityQueue;
import java.util.Arrays;public class SingleSourceShortestPath {public int[] dijkstra(int[][] graph, int src) {int n = graph.length;int[] dist = new int[n];Arrays.fill(dist, Integer.MAX_VALUE);PriorityQueue<int[]> pq = new PriorityQueue<>(n, (a, b) -> a[1] - b[1]);pq.offer(new int[]{src, 0});dist[src] = 0;while (!pq.isEmpty()) {int[] curr = pq.poll();int node = curr[0], cost = curr[1];for (int i = 0; i < n; i++) {if (graph[node][i] > 0 && dist[node] + graph[node][i] < dist[i]) {dist[i] = dist[node] + graph[node][i];pq.offer(new int[]{i, dist[i]});}}}return dist;}public static void main(String[] args) {SingleSourceShortestPath solution = new SingleSourceShortestPath();int[][] graph = {{0, 4, 0, 0, 0},{4, 0, 8, 0, 0},{0, 8, 0, 5, 0},{0, 0, 5, 0, 10},{0, 0, 0, 10, 0}};int[] result = solution.dijkstra(graph, 0);System.out.println("Shortest path lengths: " + Arrays.toString(result));}
}

题目 2:带有负权边的最短路径

描述
给定一个带有负权边的加权有向图,找到从单一源点到所有其他顶点的最短路径。如果存在负权环,则无法找到最短路径。

示例

输入:图的邻接矩阵表示,源点为 0
[[0, -1, 0, 0, 0],[-1, 0, -2, 0, 0],[0, -2, 0, -3, 0],[0, 0, -3, 0, 4],[0, 0, 0, 4, 0]
]
输出:最短路径长度数组 [0, -1, -3, -6, 2]

Java 源码(使用Bellman-Ford算法):

import java.util.Arrays;public class NegativeWeightShortestPath {public int[] bellmanFord(int[][] graph, int src) {int n = graph.length;int[] dist = new int[n];Arrays.fill(dist, Integer.MAX_VALUE);dist[src] = 0;for (int i = 0; i < n - 1; i++) {for (int u = 0; u < n; u++) {for (int v = 0; v < n; v++) {if (graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];}}}}// Check for negative-weight cyclesfor (int u = 0; u < n; u++) {for (int v = 0; v < n; v++) {if (graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {throw new IllegalStateException("Graph contains a negative-weight cycle");}}}return dist;}// main 方法与题目 1 类似
}

题目 3:所有顶点对的最短路径

描述
给定一个加权有向图,找到所有顶点对之间的最短路径。

示例

输入:图的邻接矩阵表示
[[0, 5, 0, 10],[0, 0, 3, 0],[0, 0, 0, 2],[0, 0, 0, 0]
]
输出:所有顶点对的最短路径长度矩阵

Java 源码(使用Floyd-Warshall算法):

public class AllPairsShortestPath {public int[][] floydWarshall(int[][] graph) {int n = graph.length;int[][] dist = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {dist[i][j] = (i == j) ? 0 : Integer.MAX_VALUE;}}// Fill the distance matrix with edge weightsfor (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (graph[i][k] != 0 && graph[k][j] != 0 && dist[i][k] + graph[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + graph[k][j];}}}}return dist;}public static void main(String[] args) {AllPairsShortestPath solution = new AllPairsShortestPath();int[][] graph = {{0, 5, 0, 10},{0, 0, 3, 0},{0, 0, 0, 2},{0, 0, 0, 0}};int[][] result = solution.floydWarshall(graph);System.out.println("All pairs shortest path lengths: " + Arrays.deepToString(result));}
}

这些题目和源码展示了最短路径问题的不同变体以及如何在实际编程中解决它们。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

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

相关文章

【深度学习】Attention、Self-Attention、Multi-Head Attention

一、Attention 在CV领域&#xff0c;注意力机制通常分为通道注意力和空间注意力或者两者结合。 一张图像经backbone得到的特征通常包括多个通道&#xff0c;每个通道是一个像素矩阵&#xff0c;每个通道对任务的贡献不尽相同&#xff0c;单个通道的特征图中每个像素对任务的贡…

2W 3KVDC 隔离双输出 DC/DC 电源模块——TPD-2W 系列

TPD-2W系列提供双独立输出电压&#xff0c;并且两组电压可以不同&#xff0c;这样就节省一个电源模块&#xff0c;特别适合一块板上有多个不同电压要求的设计&#xff0c;而外形尺寸和TPA一样&#xff0c;工作温度范围广-40℃到 105℃。

K8s: 在Pod里面对容器进行配额管理和相关原理

Pod里面对容器进行配额管理 在生产环境中&#xff0c;内存占用通常很大&#xff0c;如果里面有死循环&#xff0c;会导致内存和cpu过大导致影响其他pod运行资源 需要让资源在受控的环境下运行&#xff0c;一般都是加上 resources limits 的配置才能达到最佳实践 默认cpu是0.5…

LabVIEW连接postgre sql

一、安装ODBC 下载对应postgreSQL版本的ODBC 下载网址&#xff1a;http://ftp.postgresql.org/pub/odbc/versions/msi/ 下载好后默认安装就行&#xff0c;这样在ODBC数据源中才能找到。 二、配置系统DSN 实现要新建好要用的数据库&#xff0c;这里的用户名&#xff1a;postg…

new[]与delete[]

&#xff08;要理解之前关于new,delete的一些概念&#xff0c;看​​​​​​ CSDN&#xff09; 引子&#xff1a; 相比new&#xff0c;new[]不仅仅是个数的增加&#xff0c;还有int大小记录空间的创建&#xff0c; 下图中错误的用模拟多个new来替代new[]&#xff0c;释放步…

tcp网络编程(基础)

目录 一.编程前的一些基础 二.tcp网络编程 1.一个服务器只能有一个客户端连接&#xff08;下面代码&#xff09; Socket.hpp TcpServer.hpp TcpServerMain.cc TcpClientMain.cc 2.一个服务器可以有多个客户端连接&#xff08;多线程&#xff09; 看这篇文章前&#xff0c…

自定义注解+AOP实现日志记录

定义日志表结构 CREATE TABLE sys_oper_log (id bigint NOT NULL AUTO_INCREMENT COMMENT 日志主键,title varchar(50) DEFAULT COMMENT 模块标题,business_type varchar(20) DEFAULT 0 COMMENT 业务类型&#xff08;0其它 1新增 2修改 3删除&#xff09;,method varchar(100…

9.MMD 基础内容总结及制作成品流程

前期准备 1. 导入场景和模型 在左上角菜单栏&#xff0c;显示里将编辑模型时保持相机和光照勾选上&#xff0c;有助于后期调色 将抗锯齿和各向异性过滤勾掉&#xff0c;可以节省资源&#xff0c;避免bug 在分辨率设定窗口&#xff0c;可以调整分辨率 3840x2160 4k分辨率 1…

【python】图形用户界面学习之tkinter

认识tkinter Tkinter是Python中内置的图形用户界面&#xff08;GUI&#xff09;库。它是Tk GUI工具包的接口&#xff0c;可以创建和管理窗口、按钮、标签、文本框等各种GUI组件&#xff0c;并与用户交互。 使用Tkinter&#xff0c;可以创建各种GUI应用程序&#xff0c;如桌面…

QT Webengine开发过程报错qml: Render process exited with code 159 (killed)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法二、补充说明总结 前言 基于QT的Webengine开发过程中&#xff0c;QT的官方示例quicknanobrowser也无法成功运行&#xff0c;程序运行后&#xff0…

git的学习

设置用户&#xff08;目的在于可以在远端看到是谁提交了内容&#xff0c;更方便公司的管理&#xff09; 1、设置全局用户&#xff08;在家路径下创建用户&#xff0c;每个项目都用这一个用户&#xff09;>: git config --global user.name manba >: git config --global …

《AI聊天类工具之八——​ 小悟空》

一.简介 官网:小悟空 小悟空是一款集智能对话和辅助推荐功能于一体的强大工具集。它为用户提供了创作生成、学习提升、工作职场、专业咨询、虚拟角色和休闲娱乐等二十余个类别的智能服务,以满足用户在工作、生活和娱乐各方面的需求。 在创作生成方面,小悟空可以帮助用户进…

使用Go语言和chromedp库下载Instagram图片:简易指南

摘要/导言 本文将介绍如何使用Go语言配合chromedp库来下载Instagram上的图片。我们将通过一个简单的示例来展示整个过程&#xff0c;包括如何设置爬虫代理IP以绕过网络限制。 背景/引言 在数据采集和自动化测试领域&#xff0c;Go语言以其出色的执行效率、简洁的语法和卓越的…

【科学研究】那些考进精英大学的农家子弟们

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

智能化转型的得力助手:山海鲸智慧工厂解决方案详解

在数字化浪潮席卷全球的今天&#xff0c;工业领域正迎来一场前所未有的智能化变革。作为这一变革的领军者&#xff0c;山海鲸智慧工厂解决方案以其前瞻性的技术理念和创新的解决方案&#xff0c;为工业发展注入了强大的动力。 山海鲸智慧工厂解决方案的核心在于其高度的集成性…

uniapp读取(获取)缓存中的对象值(微信小程序)

文章目录 问题描述解决方案存值取值 问题描述 大家好&#xff01;我是夏小花&#xff0c;今天是2024年4月24日|农历三月十六&#xff0c;在我们日常开发中&#xff0c;做小程序可能会往缓存中存值或者是存对象&#xff0c;今天这篇博客文章主要是讲如何在微信小程序如何读取缓存…

Windows Server 2012 R2 中 IIS 8.5 安装证书

文章目录 前言一、获取服务器证书二、证书格式转换二、IIS8安装证书1.Win R 键打开运行窗口 → 输入【inetmgr】→ 点击【确定】2.打开【IIS管理器】→ 点击计算机名称 → 双击打开【服务器证书】3.点击【导入】4.选择证书文件 → 输入密码 → 点击【确定】5.选择要使用证书的…

14. Spring AOP(二)实现原理

源码位置&#xff1a;spring_aop 上一篇文章中我们主要学习了AOP的思想和Spring AOP使用&#xff0c;本文讲的是Spring是如何实现AOP的&#xff0c;Spring AOP是基于动态代理来实现AOP的&#xff0c;在将动态代理之前先来了解一下什么是代理模式。 1. 代理模式 在现实中就有许…

深度学习transformer架构详细详解

一、transformer的贡献 transformer架构的贡献&#xff1a;该架构只使用自注意力机制&#xff0c;没有使用RNN或卷积网络。且可以实现并行计算&#xff0c;加快模型训练速度。 &#xff08;将所有的循环层全部换成&#xff1a;multi-headed self-attention&#xff09; 二、t…

VisualStudio2019和2022开发Winform项目用到Devexpress组件报错不能正确加载的解决办法

1.报错1 问题简单描述&#xff1a;DevExpress.Utils.ImageCollectionStreamer 无法强制转换为 DevExpress.Utils.ImageCollectionStreamer。 原因分析&#xff1a;原项目某个组件使用的是 DevExpresss.XtraBars.v15.1版本&#xff0c;直接引用扩展控件改成引用v20.2。 解决办法…