Inhaltsverzeichnis
Grammatik
Algorithmus
Methode 2
Beispiel 2
Ausgabe
Fazit
Heim Backend-Entwicklung C++ Fragen Sie ab, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente eines ungerichteten Diagramms befinden

Fragen Sie ab, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente eines ungerichteten Diagramms befinden

Sep 05, 2023 pm 01:05 PM
Fragen Sie verbundene Komponentenscheitelpunkte ab

Fragen Sie ab, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente eines ungerichteten Diagramms befinden

Die Graphentheorie befasst sich mit der Untersuchung verbundener Komponenten, bei denen es sich um Untergraphen in einem ungerichteten Graphen handelt, bei dem jedes Scheitelpunktpaar durch einen Pfad verbunden ist und kein anderer Scheitelpunkt mit ihm verbunden ist.

In diesem Artikel befassen wir uns damit, wie wir mithilfe der Programmiersprache C/C++ bestimmen können, ob zwei Scheitelpunkte X und Y zu derselben verbundenen Komponente in einem ungerichteten Graphen gehören. Wir werden die Syntax und das Grundprinzip der Methode klären, bevor wir mindestens zwei verschiedene Möglichkeiten zur Lösung dieses Problems erläutern. Darüber hinaus stellen wir für jede Methode spezifische Codebeispiele und die entsprechenden Ergebnisse bereit.

Grammatik

Der bereitgestellte Codeausschnitt deklariert drei Funktionen in C++ zur grafischen Darstellung. Die Funktion isConnected nimmt zwei Scheitelpunkte X und Y und gibt einen booleschen Wert zurück, der angibt, ob sie zur gleichen verbundenen Komponente gehören. Die Funktion addEdge nimmt zwei Scheitelpunkte X und Y und erstellt eine Verbindung zwischen ihnen im Diagramm. Die Funktion „InitializeGraph“ verwendet einen ganzzahligen Wert n als Eingabe und erstellt einen Graphen mit n Eckpunkten. Diese Funktionen können mithilfe verschiedener Diagrammalgorithmen ausgeführt werden, z. B. der Tiefensuche oder der Breitensuche, um die Konnektivität zweier Scheitelpunkte zu überprüfen und Verbindungen zwischen Scheitelpunkten im Diagramm herzustellen.

bool isConnected(int X, int Y)
{
   // Code to check if X and Y are in the same connected component
   // Return true if X and Y are in the same connected component, false otherwise
}

void addEdge(int X, int Y)
{
   // Code to add an edge between vertices X and Y in the graph
}
void initializeGraph(int n)
{
   // Code to initialize the graph with 'n' vertices
}
Nach dem Login kopieren

Algorithmus

Schritt 1 – Initialisieren Sie das Diagramm mit der angegebenen Anzahl von Scheitelpunkten mithilfe der Funktion „Diagramm initialisieren“.

Schritt 2 – Verwenden Sie die Funktion addEdge, um Kanten zwischen Eckpunkten hinzuzufügen

Schritt 3 – Implementieren Sie eine Graph-Traversal-Methode, um jeden mit einem Scheitelpunkt verbundenen Scheitelpunkt zu durchlaufen und ihn als besucht zu markieren.

Schritt 4 – Verwenden Sie die Methode zum Durchlaufen konstruierter Graphen, um festzustellen, ob beide Scheitelpunkte X und Y besucht wurden.

Schritt 5 – Wenn beide Scheitelpunkte X und Y besucht werden, geben Sie true zurück, andernfalls geben Sie false zurück.

Methode

  • Methode 1 – Verwenden Sie DFS; es handelt sich um einen Graph-Traversal-Algorithmus, der iterativ Scheitelpunkte besucht und sie als besucht markiert, um den Graphen zu untersuchen.

  • Methode 2 – Verwenden Sie die Union-Suchmethode, die Datenstrukturen verwendet, um die Aufteilung der Sammlung in verschiedene Untergruppen zu überwachen. Es kann verbundene Teile ungerichteter Graphen effektiv identifizieren.

Methode 1

Bei dieser Methode wird DFS verwendet, um zu prüfen, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente befinden. Wir können am Scheitelpunkt X beginnen und den Graphen mit DFS durchlaufen.

Beispiel 1

Der Code wertet aus, um zu überprüfen, ob zwei Scheitelpunkte X und Y zu derselben verbundenen Komponente im Diagramm gehören. Es verwendet einen Tiefensuchalgorithmus (DFS), um den Graphen zu durchqueren und die Konnektivität von Eckpunkten zu bestimmen. Der Graph wird mithilfe von Adjazenzlisten beschrieben, wobei Kanten zwischen Scheitelpunkten als Liste der benachbarten Scheitelpunkte jedes Scheitelpunkts gespeichert werden. Der Code initialisiert das besuchte Array, um die Scheitelpunkte zu überwachen, die während der DFS-Durchquerung untersucht wurden. Führen Sie die DFS-Funktion am Scheitelpunkt X aus. Wenn festgestellt wird, dass der Scheitelpunkt Y während des DFS-Prozesses besucht wird, bedeutet dies, dass sowohl X als auch Y Teil derselben verbundenen Komponente sind. Die Hauptfunktion richtet den Graphen ein, indem sie eine Adjazenzliste erstellt und ihr Kanten hinzufügt. Anschließend führt sie mehrere Abfragen durch, um zu überprüfen, ob sich zwei Scheitelpunkte in derselben verbundenen Komponente befinden.

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

vector<int> adjList[100005];
bool visited[100005];

void dfs(int u) {
   visited[u] = true;
   for (int v : adjList[u])
      if (!visited[v])
   dfs(v);
}

bool areVerticesInSameComponentDFS(int X, int Y, int n) {
   for (int i = 1; i <= n; i++)
      visited[i] = false;
   dfs(X);
   return visited[Y];
}

int main() {
   int n = 5;
   int m = 4;
   int edges[][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
   for (int i = 0; i < m; i++) {
      int u = edges[i][0];
      int v = edges[i][1];
      adjList[u].push_back(v);
      adjList[v].push_back(u);
   }
   int q = 2;
   int queries[][2] = {{1, 4}, {2, 5}};
   for (int i = 0; i < q; i++) {
      int X = queries[i][0];
      int Y = queries[i][1];
      if (areVerticesInSameComponentDFS(X, Y, n))
         cout << "Vertices " << X << " and " << Y << " are in the same connected component." << endl;
      else
         cout << "Vertices " << X <<" and " << Y << " are not in the same connected component." << endl;
   }
   return 0;
}
Nach dem Login kopieren

Ausgabe

Vertices 1 and 4 are in the same connected component.
Vertices 2 and 5 are in the same connected component.
Nach dem Login kopieren

Methode 2

Bei diesem Ansatz können wir zunächst jeden Scheitelpunkt einer disjunkten Menge zuweisen, um mithilfe der Methode „and“ zu ermitteln, ob sich die Scheitelpunkte X und Y in derselben Verbindungskomponente befinden. Die Sammlung der Kantenendpunkte kann dann für jede Kante im Diagramm kombiniert werden. Schließlich können wir feststellen, ob die Scheitelpunkte X und Y Mitglieder derselben Menge sind, was darauf hinweist, dass es sich um verwandte Komponenten handelt.

Beispiel 2

Dieser Code implementiert und findet einen Algorithmus, um zu überprüfen, ob sich zwei Scheitelpunkte in derselben verbundenen Komponente des Diagramms befinden. Die Eingabe ist in Form einer Anzahl von Scheitelpunkten n, einer Anzahl von Kanten m und einem Kantenarray Edges[m][2] sowie einer Abfragenummer q und einem Abfragearray Queries[q][2] fest codiert. . Die Funktion merge(u, v) führt die Menge, die den Scheitelpunkt u enthält, mit der Menge zusammen, die den Scheitelpunkt v enthält. Die Funktion areVerticesInSameComponentUnionFind(X, Y) prüft, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente befinden, indem sie ihre übergeordneten Knoten findet und prüft, ob sie gleich sind. Wenn sie gleich sind, befinden sich die Scheitelpunkte in derselben verbundenen Komponente, andernfalls nicht. Die Abfrageergebnisse werden auf der Konsole gedruckt.

#include <iostream>
using namespace std;
int parent[100005];
// Function to find the parent of a set using the Union-Find algorithm
int find(int u) {
    if (parent[u] == u) {
        return u;
    }
    return find(parent[u]);
}
void merge(int u, int v) {
    int parentU = find(u); // find the parent of u
    int parentV = find(v);
    if (parentU != parentV) {
        parent[parentU] = parentV;
    }
}
bool areVerticesInSameComponentUnionFind(int X, int Y) {
    int parentX = find(X); // find the parent of X
    int parentY = find(Y); // find the parent of Y
    return parentX == parentY;
}
int main() {
    int n = 5, m = 4;
    int edges[m][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
    }
    for (int i = 0; i < m; i++) {
        int u = edges[i][0], v = edges[i][1];
        merge(u, v);
    }
    int q = 3;
    int queries[q][2] = {{1, 5}, {3, 5}, {1, 4}};
    for (int i = 0; i < q; i++) {
        int X = queries[i][0], Y = queries[i][1];
        if (areVerticesInSameComponentUnionFind(X, Y)) {
            cout << "Vertices " << X << " and " << Y << " are in the same connected component." << endl;
        } else {
            cout << "Vertices " << X << " and " << Y << " are not in the same connected component." << endl;
        }
    }
    return 0;
}
Nach dem Login kopieren

Ausgabe

Vertices 1 and 5 are in the same connected component.
Vertices 3 and 5 are in the same connected component.
Vertices 1 and 4 are in the same connected component.
Nach dem Login kopieren

Fazit

In diesem Code stellen wir zwei Methoden vor, um zu bestimmen, ob zwei ungerichtete Graphscheitelpunkte X und Y miteinander in Beziehung stehen. Die zweite Strategie verwendet einen Union-Find-Algorithmus, um disjunkte Mengen zu verfolgen, während der erste Ansatz die Tiefensuche (DFS) verwendet, um den Graphen zu durchqueren und besuchte Eckpunkte zu markieren.

Das obige ist der detaillierte Inhalt vonFragen Sie ab, ob sich die Scheitelpunkte X und Y in derselben verbundenen Komponente eines ungerichteten Diagramms befinden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Mar 12, 2025 pm 04:50 PM

In diesem Artikel werden die C -Standard -Vorlagenbibliothek (STL) erläutert, die sich auf seine Kernkomponenten konzentriert: Container, Iteratoren, Algorithmen und Funktoren. Es wird beschrieben, wie diese interagieren, um die generische Programmierung, die Verbesserung der Codeeffizienz und die Lesbarkeit t zu ermöglichen

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Mar 12, 2025 pm 04:52 PM

Dieser Artikel beschreibt die effiziente Verwendung von STL -Algorithmus in c. Es betont die Auswahl der Datenstruktur (Vektoren vs. Listen), Algorithmus -Komplexitätsanalyse (z. B. std :: sortieren vs. std :: partial_sort), Iteratoranwendungen und parallele Ausführung. Häufige Fallstricke wie

Wie gehe ich effektiv mit Ausnahmen in C um? Wie gehe ich effektiv mit Ausnahmen in C um? Mar 12, 2025 pm 04:56 PM

In diesem Artikel wird die effektive Ausnahmebehandlung in C, Covering Try, Catch und Wurp Mechanics, beschrieben. Es betont Best Practices wie Raii, die Vermeidung unnötiger Fangblöcke und die Protokollierung von Ausnahmen für robusten Code. Der Artikel befasst sich auch mit Perf

Wie verwende ich die Semantik in C, um die Leistung zu verbessern? Wie verwende ich die Semantik in C, um die Leistung zu verbessern? Mar 18, 2025 pm 03:27 PM

In dem Artikel wird die Verwendung von Move Semantics in C erörtert, um die Leistung zu verbessern, indem unnötiges Kopieren vermieden wird. Es umfasst die Implementierung von Bewegungskonstruktoren und Zuordnungsbetreibern unter Verwendung von STD :: MOVE

Wie verwende ich Bereiche in C 20 für ausdrucksstärkere Datenmanipulationen? Wie verwende ich Bereiche in C 20 für ausdrucksstärkere Datenmanipulationen? Mar 17, 2025 pm 12:58 PM

C 20 -Bereiche verbessern die Datenmanipulation mit Ausdruckskraft, Komposition und Effizienz. Sie vereinfachen komplexe Transformationen und integrieren sich in vorhandene Codebasen, um eine bessere Leistung und Wartbarkeit zu erhalten.

Wie funktioniert der dynamische Versand in C und wie wirkt sich dies auf die Leistung aus? Wie funktioniert der dynamische Versand in C und wie wirkt sich dies auf die Leistung aus? Mar 17, 2025 pm 01:08 PM

In dem Artikel wird der dynamische Versand in C, seine Leistungskosten und Optimierungsstrategien erörtert. Es unterstreicht Szenarien, in denen der dynamische Versand die Leistung beeinflusst, und vergleicht sie mit statischer Versand, wobei die Kompromisse zwischen Leistung und Betonung betont werden

Wie verwende ich RValue -Referenzen effektiv in C? Wie verwende ich RValue -Referenzen effektiv in C? Mar 18, 2025 pm 03:29 PM

Artikel erörtert den effektiven Einsatz von RValue -Referenzen in C für Bewegungssemantik, perfekte Weiterleitung und Ressourcenmanagement, wobei Best Practices und Leistungsverbesserungen hervorgehoben werden. (159 Charaktere)

Wie funktioniert das Speicherverwaltungsmanagement von C, einschließlich neuer, löschlicher und intelligenter Zeiger? Wie funktioniert das Speicherverwaltungsmanagement von C, einschließlich neuer, löschlicher und intelligenter Zeiger? Mar 17, 2025 pm 01:04 PM

C Speicherverwaltung verwendet neue, löschende und intelligente Zeiger. In dem Artikel werden manuelle und automatisierte Verwaltung erörtert und wie intelligente Zeiger Speicherlecks verhindern.

See all articles