graph implementation c using adjacency list
Tento výukový program vysvětluje implementaci grafů v C ++. Dozvíte se také o různých typech, reprezentacích a aplikacích grafů:
Graf je nelineární datová struktura. Graf lze definovat jako soubor uzlů, které se také nazývají „vrcholy“ a „hrany“, které spojují dva nebo více vrcholů.
Na graf lze také pohlížet jako na cyklický strom, kde vrcholy nemají vztah rodič - dítě, ale udržují mezi nimi složitý vztah.
bezplatná aplikace pro časovou kartu pro iPhone a Android
=> Klikněte sem a získejte Absolute C ++ Training Series.
Co se naučíte:
Co je graf v C ++?
Jak je uvedeno výše, graf v C ++ je nelineární datová struktura definovaná jako kolekce vrcholů a hran.
Následuje příklad datové struktury grafu.
Výše je uveden příklad grafu G. Graf G je množina vrcholů {A, B, C, D, E} a množina hran {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Typy grafů - směrovaný a nepřímý graf
Graf, ve kterém hrany nemají směry, se nazývá Neusměrněný graf. Graf zobrazený výše je neorientovaný graf.
Graf, ve kterém mají hrany spojené směry, se nazývá směrovaný graf.
Níže je uveden příklad směrovaného grafu.
V orientovaném grafu zobrazeném výše tvoří hrany uspořádaný pár, kde každá hrana představuje specifickou cestu z jednoho vrcholu do druhého. Vrchol, ze kterého cesta iniciuje, se nazývá „ Počáteční uzel „Zatímco vrchol, do kterého cesta končí, se nazývá„ Uzel terminálu “.
Ve výše uvedeném grafu je tedy sada vrcholů {A, B, C, D, E} a sada hran je {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Budeme diskutovat o terminologii grafu nebo o běžných pojmech používaných ve vztahu k níže uvedenému grafu.
Terminologie grafů
- Vrchol: Každý uzel grafu se nazývá vrchol. Ve výše uvedeném grafu jsou A, B, C a D vrcholy grafu.
- Okraj: Spojení nebo cesta mezi dvěma vrcholy se nazývá hrana. Spojuje dva nebo více vrcholů. Různé hrany ve výše uvedeném grafu jsou AB, BC, AD a DC.
- Sousední uzel: Pokud jsou v grafu dva uzly spojeny hranou, pak se jim říká sousední uzly nebo sousedé. Ve výše uvedeném grafu jsou vrcholy A a B spojeny hranou AB. A a B jsou tedy sousední uzly.
- Stupeň uzlu: Počet hran, které jsou spojeny s konkrétním uzlem, se nazývá stupeň uzlu. Ve výše uvedeném grafu má uzel A stupeň 2.
- Cesta: Pořadí uzlů, které musíme sledovat, když musíme v grafu cestovat z jednoho vrcholu do druhého, se nazývá cesta. V našem příkladu grafu, pokud potřebujeme přejít z uzlu A do C, pak by cesta byla A-> B-> C.
- Uzavřená cesta: Pokud je počáteční uzel stejný jako koncový uzel, pak se tato cesta nazývá uzavřená cesta.
- Jednoduchá cesta: Uzavřená cesta, ve které jsou všechny ostatní uzly odlišné, se nazývá jednoduchá cesta.
- Cyklus: Cesta, ve které nejsou žádné opakované hrany nebo vrcholy a první a poslední vrcholy jsou stejné, se nazývá cyklus. Ve výše uvedeném grafu je A-> B-> C-> D-> A cyklus.
- Připojený graf: Připojený graf je ten, ve kterém je cesta mezi každým z vrcholů. To znamená, že neexistuje jediný vrchol, který je izolovaný nebo bez spojovací hrany. Graf zobrazený výše je spojeným grafem.
- Kompletní graf: Graf, ve kterém je každý uzel připojen k jinému, se nazývá úplný graf. Pokud N je celkový počet uzlů v grafu, pak celý graf obsahuje N (N-1) / 2 počet hran.
- Vážený graf: Kladná hodnota přiřazená každé hraně označující její délku (vzdálenost mezi vrcholy spojenými hranou) se nazývá váha. Graf obsahující vážené hrany se nazývá vážený graf. Váha hrany e je označena w (e) a označuje náklady na pohyb hranou.
- Diagraf: Digraf je graf, ve kterém je každá hrana spojena s určitým směrem a průchod lze provést pouze v určeném směru.
Grafové znázornění
Způsob, jakým se datová struktura grafu ukládá do paměti, se nazývá „reprezentace“. Graf lze uložit jako postupné znázornění nebo jako spojené znázornění.
Oba tyto typy jsou popsány níže.
Postupné zastoupení
Při postupném znázorňování grafů používáme matici sousedství. Matice sousedství je matice o velikosti n x n, kde n je počet vrcholů v grafu.
Řádky a sloupce matice sousedství představují vrcholy v grafu. Maticový prvek je nastaven na 1, pokud je mezi vrcholy přítomna hrana. Pokud hrana není, pak je prvek nastaven na 0.
Níže je uveden příklad grafu, který ukazuje matici sousednosti.
Viděli jsme matici sousedství pro výše uvedený graf. Všimněte si, že se jedná o neorientovaný graf a můžeme říci, že hrana je přítomna v obou směrech. Například, protože je přítomna hrana AB, můžeme usoudit, že je přítomna také hrana BA.
V matici sousedství vidíme interakce vrcholů, které jsou maticovými prvky, které jsou nastaveny na 1, kdykoli je hrana přítomna, a na 0, když hrana chybí.
Nyní se podívejme na matici sousedství orientovaného grafu.
Jak je uvedeno výše, průsečíkový prvek v matici sousedství bude 1 právě tehdy, když je hrana směrována z jednoho vrcholu do druhého.
Ve výše uvedeném grafu máme dvě hrany z vrcholu A. Jedna hrana končí na vrcholu B, zatímco druhá končí na vrcholu C. V matici sousednosti je tedy průsečík A & B nastaven na 1 jako průsečík A & C.
Dále uvidíme sekvenční reprezentaci váženého grafu.
Níže je uveden vážený graf a jeho odpovídající matice sousedství.
Vidíme, že postupné znázornění váženého grafu se liší od ostatních typů grafů. Zde jsou nenulové hodnoty v matici sousedství nahrazeny skutečnou hmotností hrany.
Hrana AB má váhu = 4, takže v matici sousedství jsme nastavili průnik A a B na 4. Podobně se všechny ostatní nenulové hodnoty změní na příslušné váhy.
Seznam sousedství je snazší implementovat a dodržovat. Traversal tj. Zkontrolovat, zda je hrana z jednoho vrcholu do druhého trvá O (1) čas a odstranění hrany také trvá O (1).
Ať už je graf řídký (méně okrajů) nebo hustý, vždy zabere více místa.
Propojené zastoupení
Pro propojenou reprezentaci grafu používáme seznam sousedství. Reprezentace seznamu sousedů udržuje každý uzel grafu a odkaz na uzly, které sousedí s tímto uzlem. Když procházíme všemi sousedními uzly, nastavíme další ukazatel na null na konci seznamu.
Nejprve se podívejme na neorientovaný graf a jeho seznam sousedů.
Jak je uvedeno výše, máme pro každý uzel propojený seznam (seznam sousedů). Od vrcholu A máme hrany k vrcholům B, C a D. Tyto uzly jsou tedy spojeny s uzlem A v příslušném seznamu sousedů.
Dále vytvoříme seznam sousedství pro směrovaný graf.
Ve výše zaměřeném grafu vidíme, že neexistují žádné hrany pocházející z vrcholu E. Seznam sousedů pro vrchol E je tedy prázdný.
Nyní vytvořme seznam sousedství pro vážený graf.
U váženého grafu přidáme do uzlu seznamu sousedů další pole, které označuje váhu hrany, jak je uvedeno výše.
Přidání vrcholu do seznamu sousedů je jednodušší. Také šetří místo díky implementaci propojeného seznamu. Když potřebujeme zjistit, zda existuje hrana mezi jedním vrcholem do druhého, operace není efektivní.
Základní operace s grafy
Následuje základní operace, které můžeme provést s datovou strukturou grafu:
- Přidat vrchol: Přidá vrchol do grafu.
- Přidat hranu: Přidá hranu mezi dva vrcholy grafu.
- Zobrazit vrcholy grafu: Zobrazte vrcholy grafu.
Implementace grafu C ++ pomocí seznamu sousedství
Nyní představujeme implementaci C ++, abychom demonstrovali jednoduchý graf pomocí seznamu sousedství.
Zde zobrazíme seznam sousedů pro vážený orientovaný graf. K držení seznamu sousedů a okrajů grafu jsme použili dvě struktury. Seznam sousedů je zobrazen jako (start_vertex, end_vertex, weight).
Program C ++ je následující:
#include using namespace std; // stores adjacency list items struct adjNode { int val, cost; adjNode* next; }; // structure to store edges struct graphEdge { int start_ver, end_ver, weight; }; class DiaGraph{ // insert new nodes into adjacency list from given graph adjNode* getAdjListNode(int value, int weight, adjNode* head) { adjNode* newNode = new adjNode; newNode->val = value; newNode->cost = weight; newNode->next = head; // point new node to current head return newNode; } int N; // number of nodes in the graph public: adjNode **head; //adjacency list as array of pointers // Constructor DiaGraph(graphEdge edges(), int n, int N) { // allocate new node head = new adjNode*(N)(); this->N = N; // initialize head pointer for all vertices for (int i = 0; i Výstup:
Výstup:
Seznam sousedních grafů
(start_vertex, end_vertex, hmotnost):
(0, 2, 4) (0, 1, 2)
vr headset kompatibilní s xbox one
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

Aplikace grafů
Pojďme diskutovat o některých aplikacích grafů.
- Grafy se ve výpočetní technice hojně používají k zobrazení síťových grafů, sémantických grafů nebo dokonce k zobrazení toku výpočtu.
- Grafy jsou v překladačích široce používány k zobrazení alokace zdrojů procesům nebo k označení analýzy toku dat atd.
- Grafy se také používají k optimalizaci dotazů v databázových jazycích u některých specializovaných překladačů.
- V sociálních sítích jsou grafy hlavní strukturou znázorňující síť lidí.
- K vybudování dopravního systému, zejména silniční sítě, jsou značně využívány grafy. Oblíbeným příkladem jsou mapy Google, které značně používají grafy k indikaci směrů po celém světě.
Závěr
Graf je populární a široce používaná datová struktura, která má kromě jiných oborů mnoho aplikací i v oblasti počítačové vědy. Grafy se skládají z vrcholů a hran spojujících dva nebo více vrcholů.
Graf může být směrovaný nebo neorientovaný. Můžeme reprezentovat grafy pomocí matice sousedství, která je lineárním vyjádřením, stejně jako pomocí seznamu propojených sousedů. V tomto tutoriálu jsme také probrali implementaci grafu.
=> Prohlédněte si zde Úplný seznam výukových programů C ++.
Doporučené čtení
- Výukový program pro pokročilé seznamy v Pythonu (řazení seznamu, obrácení, indexování, kopírování, připojení, součet)
- Seznam Pythonu - vytváření, přístup, rozdělování, přidávání nebo mazání prvků
- Seznam výchozích adres IP routeru pro běžné značky bezdrátových routerů
- 12 nejlepších nástrojů pro vytváření liniových grafů pro vytváření ohromujících liniových grafů (2021 RANKINGS)
- Výchozí přihlašovací heslo směrovače pro nejlepší modely směrovačů (seznam 2021)
- Propojená datová struktura seznamu v C ++ s ilustrací
- Datová struktura kruhového propojeného seznamu v C ++ s ilustrací
- Dvojnásobně propojená datová struktura seznamu v C ++ s ilustrací