Maison Java javaDidacticiel Tutoriel d'utilisation de l'algorithme SPFA

Tutoriel d'utilisation de l'algorithme SPFA

Jul 20, 2017 am 10:23 AM
算法 详解

Champ d'application : il y a des bords de poids négatifs dans un graphique donné. À l'heure actuelle, les algorithmes tels que Dijkstra n'ont pas de place pour être utilisés et la complexité de l'algorithme de Bellman-Ford est trop élevée, donc le SPFA. l'algorithme est utile. Nous convenons qu’il n’y a pas de cycle de poids négatif dans le graphe à pondération dirigée G, c’est-à-dire que le chemin le plus court doit exister. Bien entendu, nous pouvons effectuer un tri topologique avant d’exécuter l’algorithme pour déterminer s’il existe un cycle de poids négatif, mais ce n’est pas l’objet de notre discussion.

Idée d'algorithme : nous utilisons le tableau d pour enregistrer l'estimation du chemin le plus court de chaque nœud et utilisons une liste de contiguïté pour stocker le graphique G. La méthode que nous adoptons est la méthode d'approximation dynamique : mettre en place une file d'attente premier entré, premier sorti pour enregistrer les nœuds à optimiser. Lors de l'optimisation, nous retirons le nœud principal u à chaque fois et utilisons l'estimation actuelle du chemin le plus court de. point u pour quitter le point u. Le nœud pointé v subit une opération de relaxation. Si l'estimation du chemin le plus court du point v est ajustée et que le point v n'est pas dans la file d'attente actuelle, le point v est placé en fin de file d'attente. De cette manière, les nœuds sont continuellement retirés de la file d'attente pour effectuer des opérations de relaxation jusqu'à ce que la file d'attente soit vide

La complexité temporelle attendue est O(ke) , où k est le nombre moyen de fois où tous les sommets entrent dans l'équipe. On peut prouver que k est généralement inférieur ou égal à 2.

Méthode de mise en œuvre :

Créer une file d'attente au départ, il n'y a que le démarrage. point dans la file d'attente, puis créez un tableau pour enregistrer le chemin le plus court du point de départ à tous les points (la valeur initiale du tableau doit être attribuée à la valeur maximale et le chemin du point à lui-même doit être attribué à 0). Effectuez ensuite une opération de relaxation, en utilisant certains points de la file d'attente comme point de départ pour actualiser le chemin le plus court vers tous les points. Si l'actualisation réussit et que le point actualisé n'est pas dans la file d'attente, le point est ajouté à la fin de la file d'attente. . Répétez jusqu'à ce que la file d'attente soit vide.

Déterminer s'il y a une boucle négative :
Si un point entre dans la file d'attente plus de N fois, il y a une boucle négative (SPFA ne peut pas gérer les points négatifs boucles Photo)


Établissez d'abord la distance la plus courte entre le point de départ a et les points restants
Tableau de chemin

                                                                          > 1. Le premier élément (a) de l'équipe est retiré de la file d'attente, et l'opération de relaxation est effectuée sur les points d'extrémité de tous les bords avec a comme point de départ (il y a trois points b, c et d ici). À ce stade, l'état de la table de chemin est :

                                                                                                                                   Cliquez sur
pour vous inscrire la file d'attente. A ce moment, trois nouveaux nœuds b, c, d sont ajoutés à la file d'attente

Le premier élément de l'équipe, le point b, est retiré de la file d'attente. sur les points d'extrémité de toutes les arêtes avec b comme point de départ dans la séquence (il n'y a que le point e ici à ce moment, l'état de la table des chemins est :

   


Dans le tableau du chemin le plus court, l'estimation du chemin le plus court de e est également devenue plus petite e n'existe pas dans la file d'attente, donc e doit également

. rejoindre la file d'attente. À ce moment-là, les éléments de la file d'attente sont c, d, e

L'élément de tête de la file d'attente est retiré de la file d'attente au point c, et les points finaux de tous les bords commençant de c sont séquentiellement détendus (voici e , f deux points), à ce moment l'état de la table de chemin est :

Dans la table du chemin le plus court, E, la valorisation du chemin le plus court de F est devenue plus petite, E existe dans la file d'attente, F n'existe pas. Par conséquent
e n'a pas besoin de rejoindre la file d'attente, et f le fait. À ce stade, les éléments de la file d'attente sont d, e, f

. Le premier élément de l'équipe est le point d Sortez de la file d'attente et effectuez des opérations de relaxation sur les points d'extrémité de toutes les arêtes à partir de d (il n'y a que le point g ici, l'état de la table des chemins est :

                                                                            (La relaxation échoue), aucun nouveau nœud n'entre dans la file d'attente, l'élément dans la file d'attente est f, g

L'élément de tête de l'équipe f pointe hors de la file d'attente, pour toutes les arêtes avec f comme point de départ L'opération de relaxation est effectuée au point final en séquence (il y a sont trois points d, e et g ici). À ce moment, l'état de la table des chemins est :

Dans la table des chemins les plus courts, le Les estimations du chemin le plus court de e et g redeviennent plus petites. Il n'y a pas de point e dans la file d'attente, et e rejoint la file d'attente, et g n'a pas besoin de rejoindre la file d'attente. file d'attente L'élément est g, e


L'élément leader de l'équipe est hors de l'équipe au point g, et l'opération de relaxation est effectuée sur les extrémités de toutes les arêtes avec g comme le point de départ (il n'y a que le point b ici). À ce moment-là, l'état de la table de chemin est :

                                                                               Il n'y a aucun moment où b, b entre dans la file d'attente pour le moment. l'élément dans la file d'attente est e, b

Le premier élément de l'équipe, le point e, quitte la file d'attente et les points finaux de toutes les arêtes avec e comme point de départ sont détendus en séquence ( Il n'y a que le point g ici). À l'heure actuelle, l'état de la table des chemins est :

   

>Dans le tableau du chemin le plus court, l'estimation du chemin le plus court de g n'a pas changé (la relaxation a échoué à ce moment, l'élément dans la file d'attente est b
Le premier élément de la file d'attente est retiré de la file d'attente au point b , effectuez des opérations de relaxation sur les points finaux de toutes les arêtes avec b comme point de départ (il n'y a que le point e ici A ce moment, l'état de la table des chemins est :

    

Dans le tableau du chemin le plus court, l'estimation du chemin le plus court de e n'a pas changé (la relaxation a échoué), et la file d'attente est vide en ce moment

Enfin a arrive Le chemin le plus court de g est 14

code java

 

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

CLIP-BEVFormer : superviser explicitement la structure BEVFormer pour améliorer les performances de détection à longue traîne CLIP-BEVFormer : superviser explicitement la structure BEVFormer pour améliorer les performances de détection à longue traîne Mar 26, 2024 pm 12:41 PM

Écrit ci-dessus et compréhension personnelle de l'auteur : À l'heure actuelle, dans l'ensemble du système de conduite autonome, le module de perception joue un rôle essentiel. Le véhicule autonome roulant sur la route ne peut obtenir des résultats de perception précis que via le module de perception en aval. dans le système de conduite autonome, prend des jugements et des décisions comportementales opportuns et corrects. Actuellement, les voitures dotées de fonctions de conduite autonome sont généralement équipées d'une variété de capteurs d'informations de données, notamment des capteurs de caméra à vision panoramique, des capteurs lidar et des capteurs radar à ondes millimétriques pour collecter des informations selon différentes modalités afin d'accomplir des tâches de perception précises. L'algorithme de perception BEV basé sur la vision pure est privilégié par l'industrie en raison de son faible coût matériel et de sa facilité de déploiement, et ses résultats peuvent être facilement appliqués à diverses tâches en aval.

Explication détaillée de l'obtention des droits d'administrateur dans Win11 Explication détaillée de l'obtention des droits d'administrateur dans Win11 Mar 08, 2024 pm 03:06 PM

Le système d'exploitation Windows est l'un des systèmes d'exploitation les plus populaires au monde et sa nouvelle version Win11 a beaucoup attiré l'attention. Dans le système Win11, l'obtention des droits d'administrateur est une opération importante. Les droits d'administrateur permettent aux utilisateurs d'effectuer davantage d'opérations et de paramètres sur le système. Cet article présentera en détail comment obtenir les autorisations d'administrateur dans le système Win11 et comment gérer efficacement les autorisations. Dans le système Win11, les droits d'administrateur sont divisés en deux types : administrateur local et administrateur de domaine. Un administrateur local dispose de tous les droits d'administration sur l'ordinateur local

Implémentation d'algorithmes d'apprentissage automatique en C++ : défis et solutions courants Implémentation d'algorithmes d'apprentissage automatique en C++ : défis et solutions courants Jun 03, 2024 pm 01:25 PM

Les défis courants rencontrés par les algorithmes d'apprentissage automatique en C++ incluent la gestion de la mémoire, le multithread, l'optimisation des performances et la maintenabilité. Les solutions incluent l'utilisation de pointeurs intelligents, de bibliothèques de threads modernes, d'instructions SIMD et de bibliothèques tierces, ainsi que le respect des directives de style de codage et l'utilisation d'outils d'automatisation. Des cas pratiques montrent comment utiliser la bibliothèque Eigen pour implémenter des algorithmes de régression linéaire, gérer efficacement la mémoire et utiliser des opérations matricielles hautes performances.

Explication détaillée du fonctionnement de la division dans Oracle SQL Explication détaillée du fonctionnement de la division dans Oracle SQL Mar 10, 2024 am 09:51 AM

Explication détaillée de l'opération de division dans OracleSQL Dans OracleSQL, l'opération de division est une opération mathématique courante et importante, utilisée pour calculer le résultat de la division de deux nombres. La division est souvent utilisée dans les requêtes de bases de données. Comprendre le fonctionnement de la division et son utilisation dans OracleSQL est donc l'une des compétences essentielles des développeurs de bases de données. Cet article discutera en détail des connaissances pertinentes sur les opérations de division dans OracleSQL et fournira des exemples de code spécifiques pour référence aux lecteurs. 1. Opération de division dans OracleSQL

Explorez les principes sous-jacents et la sélection d'algorithmes de la fonction de tri C++ Explorez les principes sous-jacents et la sélection d'algorithmes de la fonction de tri C++ Apr 02, 2024 pm 05:36 PM

La couche inférieure de la fonction de tri C++ utilise le tri par fusion, sa complexité est O(nlogn) et propose différents choix d'algorithmes de tri, notamment le tri rapide, le tri par tas et le tri stable.

L'intelligence artificielle peut-elle prédire la criminalité ? Explorez les capacités de CrimeGPT L'intelligence artificielle peut-elle prédire la criminalité ? Explorez les capacités de CrimeGPT Mar 22, 2024 pm 10:10 PM

La convergence de l’intelligence artificielle (IA) et des forces de l’ordre ouvre de nouvelles possibilités en matière de prévention et de détection de la criminalité. Les capacités prédictives de l’intelligence artificielle sont largement utilisées dans des systèmes tels que CrimeGPT (Crime Prediction Technology) pour prédire les activités criminelles. Cet article explore le potentiel de l’intelligence artificielle dans la prédiction de la criminalité, ses applications actuelles, les défis auxquels elle est confrontée et les éventuelles implications éthiques de cette technologie. Intelligence artificielle et prédiction de la criminalité : les bases CrimeGPT utilise des algorithmes d'apprentissage automatique pour analyser de grands ensembles de données, identifiant des modèles qui peuvent prédire où et quand les crimes sont susceptibles de se produire. Ces ensembles de données comprennent des statistiques historiques sur la criminalité, des informations démographiques, des indicateurs économiques, des tendances météorologiques, etc. En identifiant les tendances qui pourraient échapper aux analystes humains, l'intelligence artificielle peut donner du pouvoir aux forces de l'ordre.

Algorithme de détection amélioré : pour la détection de cibles dans des images de télédétection optique haute résolution Algorithme de détection amélioré : pour la détection de cibles dans des images de télédétection optique haute résolution Jun 06, 2024 pm 12:33 PM

01Aperçu des perspectives Actuellement, il est difficile d'atteindre un équilibre approprié entre efficacité de détection et résultats de détection. Nous avons développé un algorithme YOLOv5 amélioré pour la détection de cibles dans des images de télédétection optique haute résolution, en utilisant des pyramides de caractéristiques multicouches, des stratégies de têtes de détection multiples et des modules d'attention hybrides pour améliorer l'effet du réseau de détection de cibles dans les images de télédétection optique. Selon l'ensemble de données SIMD, le mAP du nouvel algorithme est 2,2 % meilleur que YOLOv5 et 8,48 % meilleur que YOLOX, permettant ainsi d'obtenir un meilleur équilibre entre les résultats de détection et la vitesse. 02 Contexte et motivation Avec le développement rapide de la technologie de télédétection, les images de télédétection optique à haute résolution ont été utilisées pour décrire de nombreux objets à la surface de la Terre, notamment des avions, des voitures, des bâtiments, etc. Détection d'objets dans l'interprétation d'images de télédétection

Explication détaillée du rôle et de l'utilisation de l'opérateur modulo PHP Explication détaillée du rôle et de l'utilisation de l'opérateur modulo PHP Mar 19, 2024 pm 04:33 PM

L'opérateur modulo (%) en PHP est utilisé pour obtenir le reste de la division de deux nombres. Dans cet article, nous discuterons en détail du rôle et de l'utilisation de l'opérateur modulo et fournirons des exemples de code spécifiques pour aider les lecteurs à mieux comprendre. 1. Le rôle de l'opérateur modulo En mathématiques, lorsqu'on divise un entier par un autre entier, on obtient un quotient et un reste. Par exemple, lorsque l’on divise 10 par 3, le quotient est 3 et le reste est 1. L'opérateur modulo est utilisé pour obtenir ce reste. 2. Utilisation de l'opérateur modulo En PHP, utilisez le symbole % pour représenter le module

See all articles