graph implementation c using adjacency list
Ta vadnica razlaga izvajanje grafikonov v jeziku C ++. Spoznali boste tudi različne vrste, predstavitve in uporabo grafov:
Graf je nelinearna podatkovna struktura. Graf lahko definiramo kot zbirko vozlišč, ki se imenujejo tudi 'oglišča' in 'robovi', ki povezujejo dve ali več oglišč.
Graf je mogoče videti tudi kot ciklično drevo, kjer oglišča nimajo odnosa med starši in otroki, ampak med njimi ohranjajo zapleten odnos.
spletno mesto za pretvorbo videoposnetkov YouTube v mp3
=> Kliknite tukaj za absolutno serijo usposabljanj C ++.
Kaj se boste naučili:
Kaj je graf v jeziku C ++?
Kot je navedeno zgoraj, je graf v jeziku C ++ nelinearna podatkovna struktura, ki je definirana kot zbirka točk in robov.
Sledi primer strukture podatkov grafa.
Zgoraj je prikazan primer grafa G. Graf G je niz oglišč {A, B, C, D, E} in niz robov {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Vrste grafov - usmerjeni in neusmerjeni graf
Graf, v katerem robovi nimajo smeri, se imenuje Neusmerjeni graf. Zgoraj prikazani graf je neusmerjen graf.
Graf, v katerem so robovi povezani s smermi, se imenuje usmerjeni graf.
Spodaj je primer usmerjenega grafa.
V zgoraj prikazanem usmerjenem grafu robovi tvorijo urejen par, pri čemer vsak rob predstavlja določeno pot od ene do druge točke. Oglišče, iz katerega se pot začne, se imenuje » Začetno vozlišče 'Medtem ko se oglišče, v katerega se pot konča, imenuje' Terminalno vozlišče '.
Tako je v zgornjem grafu nabor oglišč {A, B, C, D, E}, nabor robov pa {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Razpravljali bomo o terminologiji grafa ali o splošnih izrazih, uporabljenih v zvezi s spodnjim grafom.
Grafična terminologija
- Vertex: Vsako vozlišče grafa se imenuje oglišče. V zgornjem grafu so A, B, C in D oglišča grafa.
- Rob: Povezava ali pot med dvema točkama se imenuje rob. Povezuje dve ali več oglišč. Različni robovi v zgornjem grafu so AB, BC, AD in DC.
- Sosednje vozlišče: V grafu, če sta dve vozlišči povezani z robom, se imenujejo sosednja vozlišča ali sosedje. V zgornjem grafu sta točki A in B povezana z robom AB. Tako sta A in B sosednji vozlišči.
- Stopnja vozlišča: Število robov, ki so povezani z določenim vozliščem, se imenuje stopnja vozlišča. V zgornjem grafu ima vozlišče A stopnjo 2.
- Pot: Zaporedje vozlišč, ki mu moramo slediti, ko moramo v grafu potovati iz ene točke v drugo, se imenuje pot. Če bi morali v našem primeru grafa preiti iz vozlišča A v C, bi bila pot A-> B-> C.
- Zaprta pot: Če je začetno vozlišče enako končnemu vozlišču, se ta pot imenuje zaprta pot.
- Preprosta pot: Zaprta pot, pri kateri so vsa druga vozlišča različna, se imenuje preprosta pot.
- Cikel: Pot, na kateri ni ponavljajočih se robov ali točk in sta prva in zadnja točka enaka, se imenuje cikel. V zgornjem grafu je A-> B-> C-> D-> A cikel.
- Povezani graf: Povezani graf je graf, v katerem je pot med vsako točko. To pomeni, da ni niti ene točke, ki bi bila izolirana ali brez povezovalnega roba. Zgoraj prikazani graf je povezan graf.
- Popoln graf: Graf, v katerem je vsako vozlišče povezano z drugim, se imenuje celoten graf. Če je N skupno število vozlišč v grafu, potem celotni graf vsebuje N (N-1) / 2 število robov.
- Uteženi graf: Pozitivna vrednost, dodeljena vsakemu robu, ki označuje njegovo dolžino (razdalja med oglišči, povezanimi z robom), se imenuje utež. Graf, ki vsebuje utežene robove, se imenuje utežen graf. Teža roba e je označena z w (e) in označuje stroške prehoda po robu.
- Diagram: Digraf je graf, v katerem je vsak rob povezan z določeno smerjo, prehod pa je mogoče izvesti samo v določeni smeri.
Predstavitev grafa
Način, kako je struktura podatkov grafov shranjena v pomnilniku, se imenuje 'predstavitev'. Graf lahko shranimo kot zaporedni prikaz ali kot povezan prikaz.
Obe vrsti sta opisani spodaj.
Zaporedna predstavitev
Pri zaporednem predstavljanju grafov uporabljamo matriko sosednosti. Matrika sosednosti je matrika velikosti n x n, kjer je n število točk na grafu.
Vrstice in stolpci matrice sosedstva predstavljajo oglišča v grafu. Matrični element je nastavljen na 1, če je med točkama prisoten rob. Če rob ni prisoten, je element nastavljen na 0.
Spodaj je primer grafa, ki prikazuje njegovo matriko sosednosti.
Za zgornji graf smo videli matriko sosednosti. Upoštevajte, da ker je to neusmerjen graf, lahko rečemo, da je rob prisoten v obe smeri. Na primer, ker je prisoten rob AB, lahko sklepamo, da je prisoten tudi rob BA.
V matrici sosednosti lahko vidimo interakcije oglišč, ki so elementi matrike, ki so nastavljeni na 1, kadar je rob prisoten, in na 0, kadar rob ni prisoten.
Zdaj pa si oglejmo matrico sosednosti usmerjenega grafa.
Kot je prikazano zgoraj, bo presečišče v matrici sosednosti 1, če in samo, če je rob usmerjen iz ene točke v drugo.
V zgornjem grafu imamo dva roba iz oglišča A. En rob se konča v oglišče B, drugi pa v oglišče C. Tako je v matriki sosedstva presečišče A & B nastavljeno na 1 kot presečišče A & C.
Nato bomo videli zaporedni prikaz uteženega grafa.
Spodaj je tehtani graf in njegova ustrezna matrika sosednosti.
Vidimo lahko, da se zaporedna predstavitev tehtanega grafa razlikuje od ostalih vrst grafov. Tu se vrednosti, ki niso nič v matrici sosednosti, nadomestijo z dejansko težo roba.
Rob AB ima težo = 4, zato v matriki sosednosti nastavimo presečišče A in B na 4. Podobno se vse druge vrednosti, ki niso nič, spremenijo v njihove uteži.
Seznam sosednosti je lažje izvesti in slediti. Prehod, tj. Če želite preveriti, ali obstaja rob iz ene točke v drugo, traja čas O (1), odstranitev roba pa tudi O (1).
Ne glede na to, ali je graf redek (manj robov) ali gost, vedno traja več prostora.
Povezana predstavitev
Seznam povezav uporabljamo za povezano predstavitev grafa. Predstavitev seznama sosednosti vzdržuje vsako vozlišče grafa in povezavo do vozlišč, ki so sosednja temu vozlišču. Ko prehodimo vsa sosednja vozlišča, nastavimo naslednji kazalec na nič na koncu seznama.
Najprej razmislimo o neusmerjenem grafu in njegovem seznamu sosednosti.
Kot je prikazano zgoraj, imamo za vsako vozlišče povezan seznam (seznam sosednosti). Od točke A imamo robove do točk B, C in D. Tako so ta vozlišča povezana z vozliščem A na ustreznem seznamu sosednosti.
Nato za usmerjeni graf sestavimo seznam sosednosti.
V zgoraj usmerjenem grafu vidimo, da ni robov, ki bi izvirali iz oglišča E. Zato je seznam sosednosti za oglišče E prazen.
Zdaj pa sestavimo seznam sosednosti za tehtani graf.
Za tehtani graf v vozlišče seznama sosednosti dodamo dodatno polje, da označimo težo roba, kot je prikazano zgoraj.
Dodajanje oglišča na seznam sosednosti je lažje. Prav tako prihrani prostor zaradi izvedbe povezanega seznama. Ko moramo ugotoviti, ali obstaja rob med enima ogliščema, operacija ni učinkovita.
Osnovne operacije za grafe
Sledijo osnovne operacije, ki jih lahko izvajamo na strukturi podatkov grafa:
- Dodaj točko: Grafu doda točko.
- Dodaj rob: Doda rob med dvema točkama grafa.
- Prikažite oglišča grafa: Prikažite oglišča grafa.
Izvajanje grafa C ++ z uporabo seznama sosedstva
Zdaj predstavljamo izvedbo C ++ za predstavitev preprostega grafa s pomočjo seznama sosednosti.
Tukaj bomo prikazali seznam sosednosti za tehtani usmerjeni graf. Za zadrževanje seznama sosednosti in robov grafa smo uporabili dve strukturi. Seznam sosednosti je prikazan kot (start_vertex, end_vertex, weight).
Program C ++ je naslednji:
#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 Izhod:
Izhod:
Seznam sosednosti grafa
najboljši prevajalnik za c ++
(start_vertex, end_vertex, teža):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

Uporaba grafov
Pogovorimo se o nekaterih aplikacijah grafov.
- Grafi se v računalništvu pogosto uporabljajo za prikaz omrežnih grafov ali semantičnih grafov ali celo za prikaz računskega toka.
- Grafi se v prevajalnikih pogosto uporabljajo za prikaz dodeljevanja virov procesom ali za prikaz analize toka podatkov itd.
- Grafi se uporabljajo tudi za optimizacijo poizvedb v jezikih baz podatkov v nekaterih specializiranih prevajalnikih.
- Na spletnih mestih za družabna omrežja so grafi glavne strukture, ki prikazujejo mrežo ljudi.
- Grafi se pogosto uporabljajo za gradnjo prometnega sistema, zlasti cestnega omrežja. Priljubljen primer so Googlovi zemljevidi, ki v veliki meri uporabljajo grafikone za prikaz napotkov po vsem svetu.
Zaključek
Graf je priljubljena in pogosto uporabljena podatkovna struktura, ki ima poleg drugih področij veliko aplikacij na področju računalništva. Grafi so sestavljeni iz oglišč in robov, ki povezujejo dve ali več oglišč.
Graf je lahko usmerjen ali neusmerjen. Grafe lahko predstavimo z uporabo matrice sosednosti, ki je linearna predstavitev, pa tudi z uporabo seznama sosednosti. V tej vadnici smo razpravljali tudi o izvajanju grafa.
=> Za ogled celotnega seznama vadnic za C ++ glejte tukaj.
Priporočeno branje
- Vadnica za napredne sezname Python (razvrščanje, obračanje, indeksiranje, kopiranje, združevanje, vsota)
- Python List - Ustvarjanje, dostop, rezanje, dodajanje ali brisanje elementov
- Privzeti seznam naslovov IP usmerjevalnika za običajne znamke brezžičnega usmerjevalnika
- 12 najboljših orodij za ustvarjanje linijskih grafov za ustvarjanje osupljivih linijskih grafov (2021 RANGINGS)
- Privzeto geslo za prijavo v usmerjevalnik za najboljše modele usmerjevalnikov (seznam 2021)
- Struktura povezanih seznamov podatkov v jeziku C ++ z ilustracijo
- Struktura podatkov krožnega povezanega seznama v jeziku C ++ z ilustracijo
- Dvojno povezana podatkovna struktura seznama v jeziku C ++ z ilustracijo