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; };
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; }
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
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 fonctionunionSets 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 fonctionboruvkaMST 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; }
Sortie
Shortest distances from source vertex 0: Vertex 0: 0 Vertex 1: 2 Vertex 2: 3 Vertex 3: 6
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 fonctionboruvkaMST 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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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

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<wx/wx.h>, 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

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.

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

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 ;

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

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

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()
