Maison >Java >javaDidacticiel >Comment implémenter l'algorithme du chemin le plus court d'un graphique en utilisant Java

Comment implémenter l'algorithme du chemin le plus court d'un graphique en utilisant Java

王林
王林original
2023-09-19 10:39:17736parcourir

Comment implémenter lalgorithme du chemin le plus court dun graphique en utilisant Java

Comment implémenter l'algorithme du plus court chemin d'un graphe en utilisant Java ?

Titre : Utilisez l'algorithme de Dijkstra pour résoudre le problème du chemin le plus court des graphiques

Introduction :
Le graphique est une structure de données importante en mathématiques discrètes et est largement utilisé dans les domaines des sciences de l'information et de l'informatique. L'algorithme du plus court chemin pour les graphiques est l'une des technologies clés pour résoudre de nombreux problèmes pratiques, tels que le routage du réseau, l'urbanisme, etc. Cet article présentera comment utiliser le langage de programmation Java pour implémenter le célèbre algorithme de Dijkstra afin de résoudre le problème du chemin le plus court du graphe.

1. Principe de l'algorithme :

L'algorithme de Dijkstra est un algorithme glouton utilisé pour trouver le chemin le plus court depuis un point de départ vers d'autres sommets dans un graphe pondéré. L'idée de base est de partir du point de départ, de sélectionner à chaque fois le sommet du chemin le plus court actuel et de mettre à jour les chemins les plus courts de ses sommets adjacents. Ce processus est répété jusqu'à ce que le sommet cible soit atteint ou que tous les sommets aient été visités.

2. Étapes de l'algorithme :

  1. Initialisez le tableau de distance dist[] et le tableau de chemin le plus court path[], initialisez la distance du point de départ aux autres sommets à l'infini, la distance du point de départ à lui-même à 0, et initialisez le tableau du chemin le plus court à vide ;
  2. Ajoutez le point de départ à l'ensemble visité
  3. Partez du point de départ, sélectionnez les sommets non visités v dans l'ordre et mettez à jour le chemin le plus court du point de départ vers v :

    • Si la distance entre le point de départ et le sommet w via le sommet v est plus directe que le point de départ. Si la distance jusqu'au sommet w est plus courte, mettez à jour dist[w] en dist[v] + longueur du côté (v, w), et ajoutez v au chemin [w] ;
  4. Répétez l'étape 3 jusqu'à ce que le sommet cible soit visité ou que tous les sommets aient été visités
  5. Construisez le chemin le plus court à l'envers en fonction du chemin le plus court du tableau path[].

3. Implémentation du code Java :

Ce qui suit est un exemple de code pour implémenter l'algorithme de Dijkstra en utilisant le langage Java :

import java.util.*;

public class Dijkstra {
    private static final int INF = Integer.MAX_VALUE;  // 定义无穷大

    public static void dijkstra(int[][] graph, int start) {
        int numVertices = graph[0].length;

        int[] dist = new int[numVertices];  // 存储最短路径的数组
        boolean[] visited = new boolean[numVertices]; // 记录顶点是否访问过

        for (int i = 0; i < numVertices; i++) {
            dist[i] = INF;  // 初始化距离数组为无穷大
            visited[i] = false; // 初始化访问数组为false
        }

        dist[start] = 0;  // 起点到自身的距离为0

        for (int count = 0; count < numVertices - 1; count++) {
            int u = getMinDistVertex(dist, visited);  // 选择当前最短路径的顶点

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

            for (int v = 0; v < numVertices; v++) {
                if (!visited[v] && graph[u][v] != 0 && dist[u] + graph[u][v] < dist[v]) {
                    dist[v] = dist[u] + graph[u][v];  // 更新最短路径
                }
            }
        }

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

    private static int getMinDistVertex(int[] dist, boolean[] visited) {
        int minDist = INF;
        int minDistVertex = -1;

        int numVertices = dist.length;

        for (int v = 0; v < numVertices; v++) {
            if (!visited[v] && dist[v] <= minDist) {
                minDist = dist[v];
                minDistVertex = v;
            }
        }

        return minDistVertex;
    }

    private static void printSolution(int[] dist) {
        int numVertices = dist.length;

        System.out.println("Vertex          Distance from Start");

        for (int i = 0; i < numVertices; i++) {
            System.out.println(i + "          " + dist[i]);
        }
    }

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

        dijkstra(graph, 0);
    }
}

4. Analyse de l'algorithme :

La complexité temporelle de l'algorithme de Dijkstra est O(V^2), où V est le nombre de sommets du graphique. Dans les cas où le graphique est plus grand ou comporte un plus grand nombre d’arêtes, l’efficacité de l’algorithme peut être moindre. Pour améliorer l'efficacité, des structures de données telles que les files d'attente prioritaires peuvent être utilisées pour optimiser l'algorithme de Dijkstra.

Conclusion :
Cet article présente comment utiliser le langage Java pour implémenter l'algorithme de Dijkstra afin de résoudre le problème du chemin le plus court des graphiques. Cet algorithme peut trouver le chemin le plus court depuis le point de départ vers d'autres sommets dans un graphe orienté ou non, et obtient une solution efficace en mettant à jour le tableau des chemins les plus courts. Les lecteurs peuvent explorer davantage et mieux comprendre l’algorithme du chemin le plus court pour les graphiques basé sur l’exemple de code de cet article.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn