Table des matières
Méthode à utiliser
Algorithme gourmand
Algorithme
Exemple
Sortie
Algorithme Floyd−Warshall avec coût d'inversion de bord
Conclusion
Maison développement back-end C++ Vérifie si le chemin entre deux nœuds dans le graphique donné représente le chemin le plus court

Vérifie si le chemin entre deux nœuds dans le graphique donné représente le chemin le plus court

Sep 07, 2023 pm 06:57 PM
节点 路径

Vérifie si le chemin entre deux nœuds dans le graphique donné représente le chemin le plus court

Pour vérifier si un chemin donné entre deux centres d'un graphique est conforme au chemin le plus court, vous pouvez comparer le poids total du bord le long du chemin donné avec la distance la plus courte entre la même combinaison de centres en utilisant un chemin fiable. Calculs , comme le calcul de Dijkstra ou le calcul de Floyd−Warshall. Si tous les poids des bords sur un chemin donné correspondent à la suppression la plus limitée, alors cela représente le chemin le plus simple. Également : si le poids global du bord est plus important que la distance la plus courte, cela indique qu'il existe une courte distance entre les deux centres dans le graphique.

Méthode à utiliser

  • Algorithme de Dijkstra

  • Algorithme Floyd−Warshall avec coût d'inversion de bord

Algorithme gourmand

Le calcul de Dijkstra est probablement un calcul de parcours de graphe populaire utilisé pour trouver le chemin le plus limité entre un centre source et tous les autres centres d'un graphe. Dans le cas de vérifier si un chemin donné entre deux centres est lié au chemin le plus fini, le calcul de Dijkstra peut être utilisé pour calculer la séparation la plus finie entre ces centres. En exécutant le calcul de Dijkstra à partir du hub de départ, nous obtenons les intervalles les plus finis pour tous les autres hubs. Si un itinéraire donné correspond à la distance la plus limitée entre deux hubs, il représente alors un itinéraire substantiel et le plus court. Autres : si l'itinéraire donné est plus long que la distance la plus courte calculée, cela indique qu'il existe un itinéraire plus court dans la carte.

Algorithme

  • Créer le chemin le plus court (graphique, source, destination) :

  • Initialisez un ensemble de "passé" pour stocker la distance jusqu'au centre, et initialisez un intervalle de référence de mot pour stocker la distance la plus limitée.

  • Définissez l'espacement du hub source à l'infini et l'espacement de tous les autres hubs à l'infini dans le dictionnaire des séparateurs.

  • Bien qu'il existe des nœuds non visités,

  • a. Le centre le plus éloigné de la référence du mot séparateur est sélectionné et marqué comme visité.

  • b. Pour chaque hub voisin du nœud actuel :

  • Calculez l'intervalle temporaire en ajoutant le poids du bord à la distance du nœud actuel.

  • Si l'espacement des conditions est inférieur à l'espacement de stockage, alors la distance d'inspection.

  • Renvoie vrai si la distance la plus courte entre la source et la destination dans la séparation est égale à la longueur du chemin donnée (le chemin donné représente le chemin le plus court). Sinon, retournez false.

  • Ce calcul utilise la méthode de Dijkstra pour calculer l'intervalle le plus court, puis compare la distance la plus courte entre la source et la destination avec une longueur de chemin donnée pour déterminer s'il s'agit du chemin le plus court.

Exemple

#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;

const int INF = numeric_limits<int>::max();

bool shortestPath(vector<vector<pair<int, int>>>& graph, int source, int destination, int pathLength) {
    int numNodes = graph.size();
    vector<int> distances(numNodes, INF);
    distances[source] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.emplace(0, source);

    while (!pq.empty()) {
        int u = pq.top().second;
        int dist = pq.top().first;
        pq.pop();

        if (dist > distances[u])
            continue;

        for (auto& neighbor : graph[u]) {
            int v = neighbor.first;
            int weight = neighbor.second;

            if (dist + weight < distances[v]) {
                distances[v] = dist + weight;
                pq.emplace(distances[v], v);
            }
        }
    }

    return (distances[destination] == pathLength);
}

int main() {
    int numNodes = 6;
    vector<vector<pair<int, int>>> graph(numNodes);

    // Build the graph
    graph[0].emplace_back(1, 2);
    graph[0].emplace_back(2, 5);
    graph[1].emplace_back(3, 4);
    graph[1].emplace_back(4, 1);
    graph[2].emplace_back(3, 2);
    graph[3].emplace_back(4, 3);
    graph[3].emplace_back(5, 6);
    graph[4].emplace_back(5, 2);

    int source = 0;
    int destination = 5;
    int pathLength = 8;

    bool isShortestPath = shortestPath(graph, source, destination, pathLength);

    if (isShortestPath)
        cout << "The given path represents a shortest path." << endl;
    else
        cout << "The given path does not represent a shortest path." << endl;

    return 0;
}

Copier après la connexion

Sortie

The given path does not represent a shortest path.
Copier après la connexion

Algorithme Floyd−Warshall avec coût d'inversion de bord

Le calcul Floyd-Warshall est un calcul programmé dynamiquement qui trouve le chemin le plus court entre toutes les paires de centres d'un graphique. Dans le cas de vérifier si un chemin donné entre deux centres est lié au chemin le plus limité, le calcul de Floyd-Warshall peut être utilisé pour calculer la séparation la plus courte entre tous les ensembles de centres du graphique. En comparant la distance la plus courte calculée à tous les poids de bord sur un chemin donné, nous pouvons déterminer si un chemin donné implique le chemin le plus limité. Si les poids globaux des bords correspondent à la séparation la plus courte, alors le chemin donné est probablement le chemin le plus limité entre deux centres du graphique.

Algorithme

  • Créez un réseau 2D mesurant numNodes x numNodes et initialisez-le à l'infini (INF) pour tous les ensembles de nœuds.

  • Réglez l'addition coin à coin de dist sur 0.

  • Pour chaque arête de coordination (u, v) de poids w dans le graphique, modifiez complètement dist[u][v] en w et dist[v][u] en w w_reversal, où w_reversal est l'inversion obtenue grâce à bord (v, u).

  • Effectuer le calcul Floyd−Warshall après la boucle standard :

  • Pour chaque hub à mi-chemin de numNodes à 1, procédez comme suit :

  • Pour chaque agrégat de hubs i et j de numNodes à 1, améliorez dist[i][j] au minimum de :

  • Distance[i][j]

  • Distance[i][k]Distance[k][j]

  • Une fois le calcul terminé, dist contiendra la séparation la plus limitée entre tous les groupes de hubs, en tenant compte des coûts d'inversion de bord.

  • Pour vérifier si un itinéraire donné entre deux hubs (source et destination) est l'itinéraire le plus court, comparez la longueur de l'itinéraire donné avec la distance [source][destination]. Si tel est le cas, la voie indiquée est la voie la plus limitée.

Exemple

#include <iostream>
#include <vector>
using namespace std;

const int INF = 1e9;

void floydWarshall(vector<vector<int>>& graph, int numNodes) {
    vector<vector<int>> dist(graph); // Distance matrix initialized with the graph

    for (int k = 0; k < numNodes; k++) {
        for (int i = 0; i < numNodes; i++) {
            for (int j = 0; j < numNodes; j++) {
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
            }
        }
    }

    // Printing the shortest distances
    cout << "Shortest distances between all pairs of nodes:" << endl;
    for (int i = 0; i < numNodes; i++) {
        for (int j = 0; j < numNodes; j++) {
            if (dist[i][j] == INF)
                cout << "INF ";
            else
                cout << dist[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    int numNodes = 4; // Number of nodes

    // Adjacency matrix representation of the graph with edge weights and edge reversal costs
    vector<vector<int>> graph = {
        {0, 5, INF, 10},
        {INF, 0, 3, INF},
        {INF, INF, 0, 1},
        {INF, INF, INF, 0}
    };

    floydWarshall(graph, numNodes);

    return 0;
}
Copier après la connexion

Sortie

Shortest distances between all pairs of nodes:
0 5 8 9 
INF 0 3 4 
INF INF 0 1 
INF INF INF 0 
Copier après la connexion

Conclusion

Cet article explique comment vérifier si un chemin donné entre deux centres d'un graphe représente le chemin le plus fini. Il illustre deux méthodes : le calcul de Dijkstra et le calcul de Floyd-Warshall pour obtenir des inversions de bord. L'utilisation du code en C illustre ces calculs. Il explique également brièvement les calculs et leurs utilisations. Cet article est destiné à aider les lecteurs à comprendre comment trouver la méthode la plus limitée dans un graphique et à déterminer si une méthode donnée est sans aucun doute la plus simple.

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Où se trouvent les thèmes dans Windows 11 ? Où se trouvent les thèmes dans Windows 11 ? Aug 01, 2023 am 09:29 AM

Windows 11 propose de nombreuses options de personnalisation, notamment une gamme de thèmes et de fonds d'écran. Si ces thèmes sont esthétiques à leur manière, certains utilisateurs se demandent encore où ils se situent en arrière-plan sur Windows 11. Ce guide vous montrera les différentes manières d'accéder à l'emplacement de votre thème Windows 11. Quel est le thème par défaut de Windows 11 ? L’arrière-plan du thème par défaut de Windows 11 est une fleur bleue royale abstraite en fleurs avec un fond bleu ciel. Ce fond est l'un des plus populaires, grâce à l'anticipation avant la sortie du système d'exploitation. Cependant, le système d'exploitation est également livré avec une gamme d'autres arrière-plans. Par conséquent, vous pouvez modifier l’arrière-plan du thème du bureau Windows 11 à tout moment. Les thèmes sont stockés dans Windo

Différentes utilisations des barres obliques et des barres obliques inverses dans les chemins de fichiers Différentes utilisations des barres obliques et des barres obliques inverses dans les chemins de fichiers Feb 26, 2024 pm 04:36 PM

Un chemin de fichier est une chaîne utilisée par le système d'exploitation pour identifier et localiser un fichier ou un dossier. Dans les chemins de fichiers, il existe deux symboles courants séparant les chemins, à savoir la barre oblique (/) et la barre oblique inverse (). Ces deux symboles ont des utilisations et des significations différentes selon les systèmes d'exploitation. La barre oblique (/) est un séparateur de chemin couramment utilisé dans les systèmes Unix et Linux. Sur ces systèmes, les chemins de fichiers partent du répertoire racine (/) et sont séparés par des barres obliques entre chaque répertoire. Par exemple, le chemin /home/user/Docume

Comment corriger l'erreur : classe principale introuvable ou chargée en Java Comment corriger l'erreur : classe principale introuvable ou chargée en Java Oct 26, 2023 pm 11:17 PM

Cette vidéo ne peut pas être lue en raison d'une erreur technique. (Code d'erreur : 102006) Ce guide fournit des solutions simples à ce problème courant et continue votre parcours de codage. Nous discuterons également des causes des erreurs Java et de la manière de les éviter à l'avenir. Qu'est-ce que « Erreur : classe principale introuvable ou chargée » en Java ? Java est un langage de programmation puissant qui permet aux développeurs de créer une large gamme d'applications. Cependant, sa polyvalence et son efficacité s'accompagnent d'une multitude d'erreurs courantes qui peuvent survenir lors du développement. L'une des interruptions est Erreur : classe principale user_jvm_args.txt introuvable ou chargée, ce qui se produit lorsque la machine virtuelle Java (JVM) ne trouve pas la classe principale pour exécuter un programme. Cette erreur agit comme un obstacle même dans

Comment utiliser l'algorithme de Prim en C++ Comment utiliser l'algorithme de Prim en C++ Sep 20, 2023 pm 12:31 PM

Titre : Utilisation de l'algorithme Prim et exemples de code en C++ Introduction : L'algorithme Prim est un algorithme d'arbre couvrant minimum couramment utilisé, principalement utilisé pour résoudre le problème de l'arbre couvrant minimum dans la théorie des graphes. En C++, l'algorithme de Prim peut être utilisé efficacement grâce à des structures de données raisonnables et à la mise en œuvre de l'algorithme. Cet article explique comment utiliser l'algorithme de Prim en C++ et fournit des exemples de code spécifiques. 1. Introduction à l'algorithme Prim L'algorithme Prim est un algorithme glouton. Il part d'un sommet et étend progressivement l'ensemble de sommets de l'arbre couvrant minimum jusqu'à ce qu'il contienne.

Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Mar 29, 2024 pm 12:33 PM

Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Comme le système Windows est constamment mis à jour, le dernier système Windows 11 apporte également de nouvelles modifications et fonctions. L'un des problèmes courants est que les utilisateurs ne peuvent pas trouver le chemin d'accès à « Poste de travail » dans le système Win11. Il s'agissait généralement d'une opération simple dans les systèmes Windows précédents. Cet article présentera en quoi les chemins de « Poste de travail » sont différents dans le système Win11 et comment les trouver rapidement. Sous Windows1

Obtenez la partie répertoire d'un chemin de fichier à l'aide de la fonction path/filepath.Dir Obtenez la partie répertoire d'un chemin de fichier à l'aide de la fonction path/filepath.Dir Jul 27, 2023 am 09:06 AM

Utilisez la fonction path/filepath.Dir pour obtenir la partie répertoire du chemin de fichier. Dans notre processus de développement quotidien, le traitement du chemin de fichier est souvent impliqué. Parfois, nous devons obtenir la partie répertoire du chemin du fichier, c’est-à-dire le chemin d’accès au dossier où se trouve le fichier. Dans le langage Go, vous pouvez utiliser la fonction Dir fournie par le package path/filepath pour implémenter cette fonction. La signature de la fonction Dir est la suivante : funcDir(pathstring)string La fonction Dir reçoit un mot

Analyse du chemin de stockage du code source du noyau Linux Analyse du chemin de stockage du code source du noyau Linux Mar 14, 2024 am 11:45 AM

Le noyau Linux est un noyau de système d'exploitation open source dont le code source est stocké dans un référentiel de code dédié. Dans cet article, nous analyserons en détail le chemin de stockage du code source du noyau Linux et utiliserons des exemples de code spécifiques pour aider les lecteurs à mieux comprendre. 1. Chemin de stockage du code source du noyau Linux Le code source du noyau Linux est stocké dans un référentiel Git appelé Linux, hébergé sur [https://github.com/torvalds/linux](http

Comment utiliser le module os.path pour obtenir différentes parties du chemin du fichier dans Python 3.x Comment utiliser le module os.path pour obtenir différentes parties du chemin du fichier dans Python 3.x Jul 30, 2023 pm 02:57 PM

Comment utiliser le module os.path dans Python3.x pour obtenir diverses parties du chemin du fichier. Dans la programmation Python quotidienne, nous devons souvent opérer sur le chemin du fichier, comme obtenir le nom du fichier, le répertoire du fichier, l'extension, etc. du chemin. En Python, vous pouvez utiliser le module os.path pour effectuer ces opérations. Cet article explique comment utiliser le module os.path pour obtenir différentes parties du chemin du fichier afin d'améliorer la manipulation des fichiers. Le module os.path fournit une série de

See all articles