📜  门| GATE 2017 MOCK II |问题 8(1)

📅  最后修改于: 2023-12-03 15:12:35.142000             🧑  作者: Mango

门| GATE 2017 MOCK II |问题 8

该问题是关于Dijkstra算法的应用。Dijkstra算法是一种单源最短路径算法,常用于计算从单个源点到所有其他节点的最短路径。

问题描述

给定一个有权图G(V, E)和源节点s,找出s到所有其他节点的最短距离。

解决方法

Dijkstra算法

Dijkstra算法的基本思想是贪心策略,从起点开始,每次选择与起点距离最近的顶点,直到到达终点或者所有节点都被遍历。

具体流程如下:

  • 初始化一个距离数组 $distance[]$,其中 $distance[i]$ 表示从起点 $s$ 到 $i$ 的当前最短距离,初始值为无穷大
  • 将起点 $s$ 的 $distance[s]$ 设为 $0$
  • 确认一组访问过的点 $visited[]$,并将其初始化为 $false$
  • 对于当前节点 $u$,遍历 $u$ 的所有邻居节点 $v$,计算 $distance[u]+w(u,v)$,如果这个值比 $distance[v]$ 要小,则更新 $distance[v]$
  • 选出未访问过的节点中 $distance[]$ 值最小的节点 $minDistanceNode$ ,标记该节点已访问过,并更新与 $minDistanceNode$ 相邻节点的距离数组 $distance[]$
  • 重复以上步骤,直到找到终点或者所有节点都被遍历

程序实现

下面是使用Java语言实现Dijkstra算法的代码,该代码将一个邻接矩阵(以 -1 表示两点不连通)和起点作为输入参数,并输出从起点到各个节点的最短路径。

public class DijkstraAlgorithm {
    
    public static void dijkstra(int[][] graph, int start) {
        int n = graph.length;
        int[] distance = new int[n];
        boolean[] visited = new boolean[n];
        Arrays.fill(distance, Integer.MAX_VALUE);
        distance[start] = 0;
        
        for (int i = 0; i < n - 1; i++) {
            int u = findMinimum(distance, visited);
            visited[u] = true;
            
            for (int v = 0; v < n; v++) {
                if (graph[u][v] != -1 && !visited[v]) {
                    int newDistance = distance[u] + graph[u][v];
                    if (newDistance < distance[v]) {
                        distance[v] = newDistance;
                    }
                }
            }
        }
        
        for (int i = 0; i < n; i++) {
            System.out.println("Shortest distance from " + start + " to " + i + " is " + distance[i]);
        }
    }
    
    private static int findMinimum(int[] distance, boolean[] visited) {
        int minIndex = -1;
        int minValue = Integer.MAX_VALUE;
        
        for (int i = 0; i < distance.length; i++) {
            if (!visited[i] && distance[i] < minValue) {
                minValue = distance[i];
                minIndex = i;
            }
        }
        
        return minIndex;
    }
    
    public static void main(String[] args) {
        int[][] graph = new int[][]{
            {-1, 2, 4, -1, -1},
            {2, -1, 1, 5, -1},
            {4, 1, -1, 3, 6},
            {-1, 5, 3, -1, 2},
            {-1, -1, 6, 2, -1}
        };
        int start = 0;
        dijkstra(graph, start);
    }
}
总结

Dijkstra算法是一种非常经典的图算法,可以解决许多重要的实际问题。做好理论知识的学习,熟悉算法的原理和实现方式,对于程序员来说是非常有益的。