breadth first search c program traverse graph
Tento výukový program zahrnuje první vyhledávání v C ++, ve kterém je graf nebo strom procházen po celé šířce. Dozvíte se také Algoritmus a implementace BFS:
Tento explicitní výukový program C ++ vám poskytne podrobné vysvětlení technik procházení, které lze provést na stromu nebo grafu.
Traversal je technika, pomocí které navštěvujeme každý uzel grafu nebo stromu. Existují dvě standardní metody procházení.
- Šířka první vyhledávání (BFS)
- Hledání do hloubky (DFS)
=> Prohlédněte si úplný seznam výukových programů C ++ zde.
nejlepší programy pro obnovení smazaných souborů
Co se naučíte:
Technika šířky prvního vyhledávání (BFS) v C ++
V tomto kurzu se budeme podrobně zabývat technikou vyhledávání na prvním místě.
U techniky průchodu první šíří je graf nebo strom procházen po celé šířce. Tato technika používá strukturu dat fronty k ukládání vrcholů nebo uzlů a také k určení, který vrchol / uzel by měl být dále převzat.
Algoritmus první šířky začíná kořenovým uzlem a poté prochází všemi sousedními uzly. Poté vybere nejbližší uzel a prozkoumá všechny ostatní nenavštívené uzly. Tento proces se opakuje, dokud nejsou prozkoumány všechny uzly v grafu.
Algoritmus vyhledávání první šířky
Níže je uveden algoritmus pro techniku BFS.
Vezměme G jako graf, který budeme procházet pomocí algoritmu BFS.
Nechť S je kořenový / počáteční uzel grafu.
- Krok 1: Začněte uzlem S a zařaďte jej do fronty.
- Krok 2: Následující kroky opakujte pro všechny uzly v grafu.
- Krok 3: Dequeue S a zpracovat to.
- Krok 4: Zařaďte do fronty všechny sousední uzly S a zpracujte je.
- (KONEC SMYČKY)
- Krok 6: VÝSTUP
Pseudo kód
Níže je uveden pseudokód pro techniku BFS.
Procedure BFS (G, s) G is the graph and s is the source node begin let q be queue to store nodes q.enqueue(s) //insert source node in the queue mark s as visited. while (q is not empty) //remove the element from the queue whose adjacent nodes are to be processed n = q.dequeue( ) //processing all the adjacent nodes of n for all neighbors m of n in Graph G if w is not visited q.enqueue (m) //Stores m in Q to in turn visit its adjacent nodes mark m as visited. end
Traverzy s ilustracemi
Nechť 0 je počáteční uzel nebo zdrojový uzel. Nejprve jej zařazíme do fronty do navštívené fronty a do všech jejích sousedních uzlů ve frontě.
Dále vezmeme jeden ze sousedních uzlů ke zpracování, tj. 1. Označíme jej jako navštívený odstraněním z fronty a vložíme jeho sousední uzly do fronty (2 a 3 již ve frontě). Protože 0 je již navštíveno, ignorujeme ji.
Dotazy a odpovědi administrátora salesforce
Dále vyřadíme uzel 2 a označíme jej jako navštívený. Poté je jeho sousední uzel 4 přidán do fronty.
Dále vyřadíme 3 z fronty a označíme je jako navštívené. Uzel 3 má pouze jeden sousední uzel, tj. 0, který je již navštíven. Proto to ignorujeme.
V této fázi je ve frontě přítomen pouze uzel 4. Jeho sousední uzel 2 je již navštíven, a proto ho ignorujeme. Nyní označíme 4 jako navštívené.
Dále je sekvence přítomná v navštíveném seznamu průchodem prvního grafu na šířku.
Pokud sledujeme daný graf a sekvenci procházení, můžeme si všimnout, že pro algoritmus BFS skutečně procházíme grafem po celé šířce a poté přejdeme na další úroveň.
Implementace BFS
#include #include using namespace std; // a directed graph class class DiGraph { int V; // No. of vertices // Pointer to an array containing adjacency lists list *adjList; public: DiGraph(int V); // Constructor // add an edge from vertex v to w void addEdge(int v, int w); // BFS traversal sequence starting with s ->starting node void BFS(int s); }; DiGraph::DiGraph(int V) { this->V = V; adjList = new list (V); } void DiGraph::addEdge(int v, int w) { adjList(v).push_back(w); // Add w to v’s list. } void DiGraph::BFS(int s) { // initially none of the vertices is visited bool *visited = new bool(V); for(int i = 0; i queue; // Mark the current node as visited and enqueue it visited(s) = true; queue.push_back(s); // iterator 'i' to get all adjacent vertices list ::iterator i; while(!queue.empty()) { // dequeue the vertex s = queue.front(); cout << s << ' '; queue.pop_front(); // get all adjacent vertices of popped vertex and process each if not already visited for (i = adjList(s).begin(); i != adjList(s).end(); ++i) { if (!visited(*i)) { visited(*i) = true; queue.push_back(*i); } } } } // main program int main() { // create a graph DiGraph dg(5); dg.addEdge(0, 1); dg.addEdge(0, 2); dg.addEdge(0, 3); dg.addEdge(1, 2); dg.addEdge(2, 4); dg.addEdge(3, 3); dg.addEdge(4, 4); cout << 'Breadth First Traversal for given graph (with 0 as starting node): '< Výstup:
c ++ ve srovnání s java
Procházení šířky prvního grafu pro daný graf (s 0 jako počátečním uzlem):
0 1 2 3 4
Ve výše uvedeném programu jsme implementovali BFS. Všimněte si, že graf je ve formě seznamu sousedů a pak pomocí iterátoru procházíme seznam a provádíme BFS.
Použili jsme stejný graf, který jsme použili pro ilustrační účely, jako vstup do programu k porovnání sekvence procházení.
Analýza za běhu
Pokud V je počet vrcholů a E je počet hran grafu, pak lze časovou složitost pro BFS vyjádřit jako O (| V | + | E |) . Když už jsme to řekli, záleží to také na datové struktuře, kterou používáme k reprezentaci grafu.
Pokud použijeme seznam sousedů (jako v naší implementaci), pak je časová složitost O (| V | + | E |).
Pokud použijeme matici sousedství, pak je časová složitost O (V ^ 2) .
Kromě použitých datových struktur existuje také faktor, zda je graf hustě nebo řídce osídlen.
Když počet vrcholů přesáhne počet okrajů, pak se říká, že graf je řídce spojen, protože tam bude mnoho odpojených vrcholů. V tomto případě bude časová složitost grafu O (V).
Na druhou stranu někdy může mít graf vyšší počet hran než počet vrcholů. V takovém případě se říká, že graf je hustě obydlený. Časová složitost takového grafu je O (E).
Na závěr, co znamená výraz O (| V | + | E |), závisí na tom, zda je graf hustě nebo řídce osídlen, dominující faktor, tj. Hrany nebo vrcholy, určí příslušnou časovou složitost grafu.
Aplikace BFS Traversal
- Odpadky: Technika sběru odpadků, „Cheneyho algoritmus“, používá pro kopírování sběru odpadků první průchod.
- Vysílání v sítích: Paket cestuje z jednoho uzlu do druhého pomocí techniky BFS ve vysílací síti k dosažení všech uzlů.
- GPS navigace: Můžeme použít BFS v GPS navigaci k nalezení všech sousedních nebo sousedních uzlů polohy.
- Webové stránky sociálních sítí: Vzhledem k osobě „P“ můžeme najít všechny lidi na dálku „d“ od p pomocí BFS až po úrovně d.
- Sítě typu peer to peer: BFS lze opět použít v sítích typu peer to peer k vyhledání všech sousedních uzlů.
- Nejkratší cesta a minimální rozpětí stromu v neváženém grafu: Technika BFS se používá k nalezení nejkratší cesty, tj. Cesty s nejmenším počtem hran v neváženém grafu. Podobně můžeme také najít minimální kostru pomocí BFS v neváženém grafu.
Závěr
Šířka-první vyhledávací technika je metoda, která se používá k procházení všech uzlů grafu nebo stromu v šíři způsobem.
Tato technika se většinou používá k nalezení nejkratší cesty mezi uzly grafu nebo v aplikacích, které vyžadují, abychom navštívili každý sousední uzel jako v sítích.
=> Klikněte sem a získejte bezplatný kurz C ++.
Doporučené čtení
- Binární vyhledávací strom C ++: Implementace a operace BST s příklady
- Datová struktura stromu B a stromu B + v C ++
- Implementace grafů v C ++ pomocí seznamu sousedů
- Struktura dat binárního stromu v C ++
- 12 nejlepších nástrojů pro vytváření liniových grafů pro vytváření ohromujících liniových grafů (2021 RANKINGS)
- Datová struktura stromu AVL a haldy v C ++
- Stromy v C ++: Základní terminologie, techniky procházení a typy stromů v C ++
- Graf příčin a následků - Technika psaní dynamického testovacího případu pro maximální pokrytí s méně testovacími případy