Table des matières
Grammaire
Algorithme
Méthode
Méthode 1 : Méthode simple
Exemple
Sortie
Explication
Méthode 2 : Utiliser la file d'attente prioritaire
Conclusion
Maison développement back-end C++ Algorithme Boruvka en C++ pour un arbre couvrant minimum

Algorithme Boruvka en C++ pour un arbre couvrant minimum

Aug 27, 2023 pm 02:53 PM
c 最小生成树 algorithme de Boruvka

Algorithme Boruvka en C++ pour un arbre couvrant minimum

Dans la théorie des graphes, trouver l'arbre couvrant minimum (MST) d'un graphe pondéré connecté est un problème courant. MST est un sous-ensemble d'arêtes de graphique qui relie tous les sommets et minimise le poids total des arêtes. Un algorithme efficace pour résoudre ce problème est l’algorithme de Boruvka.

Grammaire

struct Edge {
   int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
   int parent, rank;
};
Copier après la connexion

Algorithme

Maintenant, décrivons les étapes à suivre pour trouver l'arbre couvrant minimum dans l'algorithme de Boruvka −

  • Initialisez MST sur l'ensemble vide.

  • Créez un sous-ensemble pour chaque sommet, où chaque sous-ensemble ne contient qu'un seul sommet.

  • Répétez les étapes suivantes jusqu'à ce que l'arbre couvrant minimum (MST) ait des arêtes V-1 (V est le nombre de sommets dans le graphique) −

    • Pour chaque sous-ensemble, trouvez l'arête la moins chère le reliant à l'autre sous-ensemble.

    • Ajoutez les arêtes sélectionnées à un arbre couvrant minimum.

    • Effectuez une opération d'union sur un sous-ensemble d'arêtes sélectionnées.

  • Sortez l'arbre couvrant minimum.

Méthode

Dans l'algorithme de Boruvka, il existe plusieurs façons de trouver l'arête la moins chère reliant chaque sous-ensemble. Voici deux méthodes courantes −

Méthode 1 : Méthode simple

Pour chaque sous-ensemble, parcourez toutes les arêtes et trouvez la plus petite arête le reliant à l'autre sous-ensemble.

Suivez les arêtes sélectionnées et effectuez des opérations conjointes.

Exemple

#include <iostream>
#include <vector>
#include <algorithm>

struct Edge {
   int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
   int parent, rank;
};

// Function to find the subset of an element using path compression
int find(Subset subsets[], int i) {
   if (subsets[i].parent != i)
      subsets[i].parent = find(subsets, subsets[i].parent);
   return subsets[i].parent;
}

// Function to perform union of two subsets using union by rank
void unionSets(Subset subsets[], int x, int y) {
   int xroot = find(subsets, x);
   int yroot = find(subsets, y);
   if (subsets[xroot].rank < subsets[yroot].rank)
      subsets[xroot].parent = yroot;
   else if (subsets[xroot].rank > subsets[yroot].rank)
      subsets[yroot].parent = xroot;
   else {
      subsets[yroot].parent = xroot;
      subsets[xroot].rank++;
   }
}

// Function to find the minimum spanning tree using Boruvka's algorithm
void boruvkaMST(std::vector<Edge>& edges, int V) {
   std::vector<Edge> selectedEdges; // Stores the edges of the MST

   Subset* subsets = new Subset[V];
   int* cheapest = new int[V];

   // Initialize subsets and cheapest arrays
   for (int v = 0; v < V; v++) {
      subsets[v].parent = v;
      subsets[v].rank = 0;
      cheapest[v] = -1;
   }

   int numTrees = V;
   int MSTWeight = 0;

   // Keep combining components until all components are in one tree
   while (numTrees > 1) {
      for (int i = 0; i < edges.size(); i++) {
         int set1 = find(subsets, edges[i].src);
         int set2 = find(subsets, edges[i].dest);

         if (set1 != set2) {
            if (cheapest[set1] == -1 || edges[cheapest[set1]].weight > edges[i].weight)
               cheapest[set1] = i;
            if (cheapest[set2] == -1 || edges[cheapest[set2]].weight > edges[i].weight)
               cheapest[set2] = i;
         }
      }

      for (int v = 0; v < V; v++) {
         if (cheapest[v] != -1) {
            int set1 = find(subsets, edges[cheapest[v]].src);
            int set2 = find(subsets, edges[cheapest[v]].dest);

            if (set1 != set2) {
               selectedEdges.push_back(edges[cheapest[v]]);
               MSTWeight += edges[cheapest[v]].weight;
               unionSets(subsets, set1, set2);
               numTrees--;
            }

            cheapest[v] = -1;
         }
      }
   }

   // Output the MST weight and edges
   std::cout << "Minimum Spanning Tree Weight: " << MSTWeight << std::endl;
   std::cout << "Selected Edges:" << std::endl;
   for (const auto& edge : selectedEdges) {
      std::cout << edge.src << " -- " << edge.dest << " \tWeight: " << edge.weight << std::endl;
   }

   delete[] subsets;
   delete[] cheapest;
}

int main() {
   // Pre-defined input for testing purposes
   int V = 6;
   int E = 9;
   std::vector<Edge> edges = {
      {0, 1, 4},
      {0, 2, 3},
      {1, 2, 1},
      {1, 3, 2},
      {1, 4, 3},
      {2, 3, 4},
      {3, 4, 2},
      {4, 5, 1},
      {2, 5, 5}
   };

   boruvkaMST(edges, V);

   return 0;
}
Copier après la connexion

Sortie

Minimum Spanning Tree Weight: 9
Selected Edges:
0 -- 2 	Weight: 3
1 -- 2 	Weight: 1
1 -- 3 	Weight: 2
4 -- 5 	Weight: 1
3 -- 4 	Weight: 2
Copier après la connexion
La traduction chinoise de

Explication

est :

Explication

Nous définissons d'abord deux structures - Edge et Subset. Edge représente une arête dans le graphique, y compris la source, la destination et le poids de l'arête. Le sous-ensemble représente un sous-ensemble de la structure de données de la requête Union, comprenant les informations sur le parent et le classement.

La fonction find est une fonction d'assistance qui utilise la compression de chemin pour trouver un sous-ensemble d'éléments. Il trouve récursivement les représentants (nœuds parents) du sous-ensemble auquel appartient l'élément et compresse le chemin pour optimiser les requêtes futures.

La fonction

unionSets est une autre fonction auxiliaire qui fusionne deux sous-ensembles en utilisant la fusion par rang. Il trouve des représentants de deux sous-ensembles et les fusionne en fonction de leur rang pour maintenir un arbre équilibré.

La fonction

boruvkaMST prend en entrée un vecteur d'arête et un nombre de sommets (V). Il implémente l'algorithme Boruvka pour trouver MST.

Dans la fonction boruvkaMST, nous créons un vecteur selectedEdges pour stocker les bords de MST.

Nous créons un tableau de structures de sous-ensembles pour représenter les sous-ensembles et les initialisons avec des valeurs par défaut.

Nous créons également un tableau le moins cher pour garder une trace de l'avantage le moins cher pour chaque sous-ensemble.

La variable numTrees est initialisée au nombre de sommets et MSTWeight est initialisée à 0.

L'algorithme fonctionne en combinant à plusieurs reprises des composants jusqu'à ce que tous les composants soient dans un arbre. La boucle principale s'exécute jusqu'à ce que numTrees devienne 1.

À chaque itération de la boucle principale, nous parcourons toutes les arêtes et trouvons l'arête pondérée minimale pour chaque sous-ensemble. Si une arête connecte deux sous-ensembles différents, nous mettons à jour le tableau le moins cher avec l'indice de l'arête la moins pondérée.

Ensuite, nous parcourons tous les sous-ensembles. Si un sous-ensemble a une arête avec un poids minimum, nous l'ajoutons au vecteur selectedEdges, mettons à jour MSTWeight, effectuons l'opération d'union des sous-ensembles et réduisons la valeur de numTrees.

Enfin, nous générons les poids MST et les arêtes sélectionnées.

La fonction principale invite l'utilisateur à saisir le nombre de sommets et d'arêtes. Il prend ensuite l'entrée (source, cible, poids) pour chaque bord et appelle la fonction boruvkaMST avec l'entrée.

Méthode 2 : Utiliser la file d'attente prioritaire

Créez une file d'attente prioritaire triée par poids pour stocker les bords.

Pour chaque sous-ensemble, recherchez le bord de poids minimum le reliant à un autre sous-ensemble de la file d'attente prioritaire.

Suivez les arêtes sélectionnées et effectuez des opérations conjointes.

Exemple

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

// Edge structure representing a weighted edge in the graph
struct Edge {
   int destination;
   int weight;

   Edge(int dest, int w) : destination(dest), weight(w) {}
};

// Function to find the shortest path using Dijkstra's algorithm
vector<int> dijkstra(const vector<vector<Edge>>& graph, int source) {
   int numVertices = graph.size();
   vector<int> dist(numVertices, INT_MAX);
   vector<bool> visited(numVertices, false);

   dist[source] = 0;
   priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
   pq.push(make_pair(0, source));

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

      if (visited[u]) {
         continue;
      }

      visited[u] = true;

      for (const Edge& edge : graph[u]) {
         int v = edge.destination;
         int weight = edge.weight;

         if (dist[u] + weight < dist[v]) {
            dist[v] = dist[u] + weight;
            pq.push(make_pair(dist[v], v));
         }
      }
   }

   return dist;
}

int main() {
   int numVertices = 4;
   vector<vector<Edge>> graph(numVertices);

   // Adding edges to the graph
   graph[0].push_back(Edge(1, 2));
   graph[0].push_back(Edge(2, 5));
   graph[1].push_back(Edge(2, 1));
   graph[1].push_back(Edge(3, 7));
   graph[2].push_back(Edge(3, 3));

   int source = 0;
   vector<int> shortestDistances = dijkstra(graph, source);

   cout << "Shortest distances from source vertex " << source << ":\n";
   for (int i = 0; i < numVertices; i++) {
      cout << "Vertex " << i << ": " << shortestDistances[i] << endl;
   }

   return 0;
}
Copier après la connexion

Sortie

Shortest distances from source vertex 0:
Vertex 0: 0
Vertex 1: 2
Vertex 2: 3
Vertex 3: 6
Copier après la connexion
La traduction chinoise de

Explication

est :

Explication

Dans cette approche, nous utilisons une file d'attente prioritaire pour optimiser le processus de recherche de l'arête pondérée minimale pour chaque sous-ensemble. Vous trouverez ci-dessous une explication détaillée du code −

La structure du code et les fonctions d'assistance (telles que find et unionSets) restent les mêmes que la méthode précédente.

La fonction

boruvkaMST est modifiée pour utiliser une file d'attente prioritaire afin de trouver efficacement le bord pondéré minimum pour chaque sous-ensemble.

Au lieu d'utiliser le tableau le moins cher, nous créons maintenant une file d'attente prioritaire (pq) d'arêtes. On l'initialise avec les bords du graphe.

La boucle principale s'exécute jusqu'à ce que numTrees devienne 1, similaire à la méthode précédente.

À chaque itération, nous extrayons le bord de poids minimum (minEdge) de la file d'attente prioritaire.

Ensuite, nous utilisons la fonction find pour trouver le sous-ensemble auquel appartiennent la source et la cible de minEdge.

Si les sous-ensembles sont différents, nous ajoutons minEdge au vecteur selectedEdges, mettons à jour MSTWeight, effectuons une fusion des sous-ensembles et réduisons numTrees.

Le processus continuera jusqu'à ce que tous les composants soient dans un arbre.

Enfin, nous générons les poids MST et les arêtes sélectionnées.

La fonctionnalité principale est la même que la méthode précédente, nous avons des entrées prédéfinies à des fins de tests.

Conclusion

L'algorithme Boruvka fournit une solution efficace pour trouver l'arbre couvrant minimum d'un graphique pondéré. Notre équipe a exploré en profondeur deux voies différentes lors de l'implémentation de l'algorithme en C++ : une approche traditionnelle ou « naïve ». Un autre utilise des files d’attente prioritaires. Cela dépend des exigences spécifiques du problème donné. Chaque méthode présente certains avantages et peut être mise en œuvre en conséquence. En comprenant et en implémentant l'algorithme Boruvka, vous pouvez résoudre efficacement les problèmes d'arbre couvrant minimum dans les projets C++.

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)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois 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)

Que sont les constantes en langage C ? Pouvez-vous donner un exemple ? Que sont les constantes en langage C ? Pouvez-vous donner un exemple ? Aug 28, 2023 pm 10:45 PM

Une constante est aussi appelée variable et une fois définie, sa valeur ne change pas lors de l'exécution du programme. Par conséquent, nous pouvons déclarer une variable comme une constante faisant référence à une valeur fixe. On l'appelle aussi texte. Les constantes doivent être définies à l'aide du mot-clé Const. Syntaxe La syntaxe des constantes utilisées dans le langage de programmation C est la suivante - consttypeVariableName; (ou) consttype*VariableName; Différents types de constantes Les différents types de constantes utilisées dans le langage de programmation C sont les suivants : Constantes entières - Par exemple : 1,0 ,34, 4567 Constantes à virgule flottante - Exemple : 0.0, 156.89, 23.456 Constantes octales et hexadécimales - Exemple : Hex : 0x2a, 0xaa.. Octal

VSCode et VS C++ IntelliSense ne fonctionnent pas ou ne récupèrent pas les bibliothèques VSCode et VS C++ IntelliSense ne fonctionnent pas ou ne récupèrent pas les bibliothèques Feb 29, 2024 pm 01:28 PM

VS Code et Visual Studio C++ IntelliSense peuvent ne pas être en mesure de récupérer les bibliothèques, en particulier lorsque vous travaillez sur de grands projets. Lorsque nous survolons #Include&lt;wx/wx.h&gt;, nous voyons le message d'erreur "CannotOpen source file 'string.h'" (dépend de "wx/wx.h") et parfois, la fonction de saisie semi-automatique ne répond pas. Dans cet article, nous verrons ce que vous pouvez faire si VSCode et VSC++ IntelliSense ne fonctionnent pas ou n'extraient pas de bibliothèques. Pourquoi mon Intellisense ne fonctionne-t-il pas en C++ ? Lorsque vous travaillez avec des fichiers volumineux, IntelliSense parfois

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.

Correction du code d'erreur Xbox 8C230002 Correction du code d'erreur Xbox 8C230002 Feb 27, 2024 pm 03:55 PM

Vous ne parvenez pas à acheter ou à regarder du contenu sur votre Xbox en raison du code d'erreur 8C230002 ? Certains utilisateurs continuent de recevoir cette erreur lorsqu'ils tentent d'acheter ou de regarder du contenu sur leur console. Désolé, il y a un problème avec le service Xbox. Réessayez plus tard. Pour obtenir de l'aide sur ce problème, visitez www.xbox.com/errorhelp. Code d'état : 8C230002 Ce code d'erreur est généralement provoqué par des problèmes temporaires de serveur ou de réseau. Cependant, il peut y avoir d'autres raisons, telles que les paramètres de confidentialité de votre compte ou le contrôle parental, qui peuvent vous empêcher d'acheter ou de visualiser un contenu spécifique. Correction du code d'erreur Xbox 8C230002 Si vous recevez le code d'erreur 8C lorsque vous essayez de regarder ou d'acheter du contenu sur votre console Xbox

Programme récursif pour trouver les éléments minimum et maximum d'un tableau en C++ Programme récursif pour trouver les éléments minimum et maximum d'un tableau en C++ Aug 31, 2023 pm 07:37 PM

Nous prenons le tableau d'entiers Arr[] en entrée. Le but est de trouver les éléments les plus grands et les plus petits d’un tableau en utilisant une méthode récursive. Puisque nous utilisons la récursion, nous allons parcourir l'ensemble du tableau jusqu'à ce que nous atteignions length = 1, puis retourner A[0], qui constitue le cas de base. Sinon, l'élément actuel est comparé à la valeur minimale ou maximale actuelle et sa valeur est mise à jour de manière récursive pour les éléments suivants. Examinons différents scénarios d'entrée et de sortie pour cela −Input −Arr={12,67,99,76,32}; Output −Valeur maximale dans le tableau : 99 Explication &mi ;

China Eastern Airlines annonce que l'avion de passagers C919 sera bientôt mis en service China Eastern Airlines annonce que l'avion de passagers C919 sera bientôt mis en service May 28, 2023 pm 11:43 PM

Selon les informations du 25 mai, China Eastern Airlines a dévoilé les derniers progrès réalisés sur l'avion de passagers C919 lors de la réunion d'information sur les performances. Selon l'entreprise, le contrat d'achat du C919 signé avec COMAC est officiellement entré en vigueur en mars 2021 et le premier avion C919 a été livré fin 2022. Il est prévu que l’avion soit officiellement mis en service prochainement. China Eastern Airlines utilisera Shanghai comme base principale pour les opérations commerciales du C919 et prévoit d'introduire un total de cinq avions de passagers C919 en 2022 et 2023. La société a déclaré que les futurs plans d'introduction seront déterminés en fonction des conditions d'exploitation réelles et de la planification du réseau de routes. Selon la compréhension de l'éditeur, le C919 est la nouvelle génération chinoise d'avions de passagers monocouloirs avec des droits de propriété intellectuelle totalement indépendants dans le monde et il est conforme aux normes de navigabilité acceptées au niveau international. Devrait

Programme C++ pour imprimer un motif en spirale de nombres Programme C++ pour imprimer un motif en spirale de nombres Sep 05, 2023 pm 06:25 PM

L’affichage des nombres dans différents formats est l’un des problèmes de codage fondamentaux de l’apprentissage. Différents concepts de codage comme les instructions conditionnelles et les instructions de boucle. Il existe différents programmes dans lesquels nous utilisons des caractères spéciaux comme des astérisques pour imprimer des triangles ou des carrés. Dans cet article, nous imprimerons les nombres sous forme de spirale, tout comme les carrés en C++. Nous prenons le nombre de lignes n comme entrée, et commençons par le coin supérieur gauche et nous déplaçons vers la droite, puis vers le bas, puis vers la gauche, puis vers le haut, puis encore vers la droite, et ainsi de suite. Motif en spirale avec chiffres 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

La fonction du mot clé void en langage C La fonction du mot clé void en langage C Feb 19, 2024 pm 11:33 PM

void en C est un mot-clé spécial utilisé pour représenter un type vide, ce qui signifie des données sans type spécifique. En langage C, void est généralement utilisé dans les trois aspects suivants. Le type de retour de la fonction est void. En langage C, les fonctions peuvent avoir différents types de retour, tels que int, float, char, etc. Cependant, si la fonction ne renvoie aucune valeur, le type de retour peut être défini sur void. Cela signifie qu'une fois la fonction exécutée, elle ne renvoie pas de valeur spécifique. Par exemple : voidhelloWorld()

See all articles