Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

    • 数据结构与算法

      • 算法复杂度
      • 排序算法
      • 背包问题
      • 二叉树
      • 红黑树
      • 并查集
      • 最小生成树算法
      • 最短路径算法
        • 1. 概述
        • 2. 算法
          • 2.1 迪杰斯特拉算法
          • 2.2 弗洛伊德算法
    • 计算机网络

    • 操作系统

    • Linux

  • 框架|中间件

  • 架构

  • 后端
  • 计算机基础
  • 数据结构与算法
Marvel
2022-09-07
目录

最短路径算法

# 最短路径算法

# 1. 概述

对于加权图来说,最短路径是指两顶点之间经过的边上权值之和最小的路径,并且我们称路径上的第一个顶点是源点,最后一个点是终点。

以下面这副加权图为例:

weightedGraph2

其最短路径为:

minDistance

# 2. 算法

# 2.1 迪杰斯特拉算法

迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

时间复杂度:O(n2)


public class Dijkstra {
    private static final int INF = Integer.MAX_VALUE;

    /**
     *
     * @param graph 图
     * @param source 起点
     */
    public static void dijkstra(int[][] graph, int source) {
        // 顶点数量
        int vertices = graph.length;
        // 从起点出发到达某一个点的最短距离
        int[] dist = new int[vertices];
        boolean[] visited = new boolean[vertices];

        // 初始化距离数组
        Arrays.fill(dist, INF);
        dist[source] = 0;

        for (int i = 0; i < vertices - 1; i++) {
            int minDist = INF;
            int minIndex = -1;

            // 选择距离最小的顶点
            for (int j = 0; j < vertices; j++) {
                if (!visited[j] && dist[j] < minDist) {
                    minDist = dist[j];
                    minIndex = j;
                }
            }

            // 标记该顶点为已访问
            visited[minIndex] = true;

            // 更新与该顶点相邻顶点的最短距离
            for (int j = 0; j < vertices; j++) {
                if (!visited[j] && graph[minIndex][j] != 0 && dist[minIndex] != INF) {
                    dist[j] = Math.min(dist[j], dist[minIndex] + graph[minIndex][j]);
                }
            }
        }

        // 打印最短路径
        printShortestPaths(dist);
    }

    public static void printShortestPaths(int[] dist) {
        int vertices = dist.length;
        System.out.println("顶点\t\t最短距离");
        for (int i = 0; i < vertices; i++) {
            System.out.println(i + "\t\t" + dist[i]);
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 5, 0, 0, 0, 0, 0, 0},
                {1, 0, 3, 7, 5, 0, 0, 0, 0},
                {5, 3, 0, 0, 1, 7, 0, 0, 0},
                {0, 7, 0, 0, 2, 0, 3, 0, 0},
                {0, 5, 1, 2, 0, 3, 6, 9, 0},
                {0, 0, 7, 0, 3, 0, 0, 5, 0},
                {0, 0, 0, 3, 6, 0, 0, 2, 7},
                {0, 0, 0, 0, 9, 5, 2, 0, 4},
                {0, 0, 0, 0, 0, 0, 7, 4, 0}
        };

        dijkstra(graph, 0);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

# 2.2 弗洛伊德算法

// TODO

编辑 (opens new window)
上次更新: 2024/05/15, 17:18:50
最小生成树算法
HTTP基本概念

← 最小生成树算法 HTTP基本概念→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式