graph implementation c using adjacency list
Denna handledning förklarar implementeringen av grafer i C ++. Du kommer också att lära dig om olika typer, framställningar och tillämpningar av grafer:
En graf är en icke-linjär datastruktur. En graf kan definieras som en samling av noder som även kallas 'hörn' och 'kanter' som förbinder två eller flera hörn.
En graf kan också ses som ett cykliskt träd där hörn inte har ett förälder-barn-förhållande utan upprätthåller ett komplext förhållande mellan dem.
hur man kör en jnlp-fil
=> Klicka här för den absoluta C ++ träningsserien.
Vad du kommer att lära dig:
Vad är en graf i C ++?
Som nämnts ovan är en graf i C ++ en icke-linjär datastruktur definierad som en samling hörn och kanter.
Nedan följer ett exempel på en grafdatastruktur.
Givet ovan är ett exempeldiagram G. Diagram G är en uppsättning hörn {A, B, C, D, E} och en uppsättning kanter {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Typer av grafer - Riktad och ej riktad graf
En graf i vilken kanterna inte har riktningar kallas den ej riktade grafen. Diagrammet som visas ovan är en oriktad graf.
En graf där kanterna har riktningar associerade kallas en riktad graf.
Nedan ges ett exempel på en riktad graf.
I den riktade grafen som visas ovan bildar kanterna ett ordnat par, där varje kant representerar en specifik väg från ett toppunkt till ett annat toppunkt. Spetsen från vilken vägen inleds kallas ” Initial nod ”Medan toppunktet som vägen slutar kallas” Terminalnod ”.
Således i ovanstående diagram är uppsättningen av hörn {A, B, C, D, E} och uppsättningen kanter är {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Vi kommer att diskutera grafterminologin eller de vanliga termerna som används i förhållande till diagrammet nedan.
Grafterminologi
- Vertex: Varje nod i diagrammet kallas ett toppunkt. I ovanstående diagram är A, B, C och D kurvorna i diagrammet.
- Kant: Länken eller banan mellan två hörn kallas en kant. Den ansluter två eller flera hörn. De olika kanterna i ovanstående diagram är AB, BC, AD och DC.
- Intilliggande nod: I en graf, om två noder är förbundna med en kant kallas de angränsande noder eller grannar. I ovanstående diagram är hörn A och B förbundna med kant AB. Således är A och B intilliggande noder.
- Graden av noden: Antalet kanter som är anslutna till en viss nod kallas nodens grad. I ovanstående diagram har nod A en grad 2.
- Väg: Sekvensen av noder som vi behöver följa när vi måste resa från ett toppunkt till ett annat i en graf kallas banan. I vårt exempeldiagram, om vi behöver gå från nod A till C, skulle sökvägen vara A-> B-> C.
- Stängd väg: Om den initiala noden är densamma som en terminalnod kallas den sökvägen som den stängda banan.
- Enkel väg: En sluten väg där alla andra noder är distinkta kallas en enkel sökväg.
- Cykel: En bana där det inte finns några upprepade kanter eller hörn och de första och sista hörnarna är desamma kallas en cykel. I ovanstående diagram är A-> B-> C-> D-> A en cykel.
- Ansluten graf: En ansluten graf är den där det finns en bana mellan var och en av hörnpunkterna. Det betyder att det inte finns ett enda toppunkt som är isolerat eller utan en anslutningskant. Grafen som visas ovan är en ansluten graf.
- Komplett diagram: En graf där varje nod är ansluten till en annan kallas Komplett graf. Om N är det totala antalet noder i en graf innehåller hela grafen N (N-1) / 2 antal kanter.
- Viktat diagram: Ett positivt värde som tilldelas varje kant som anger dess längd (avståndet mellan topparna som är förbundna med en kant) kallas vikt. Grafen som innehåller viktade kanter kallas ett viktat diagram. Vikten av en kant e betecknas med w (e) och det indikerar kostnaden för att korsa en kant.
- Stycke: En digraf är en graf där varje kant är associerad med en specifik riktning och traversal kan endast göras i specificerad riktning.
Diagramrepresentation
Det sätt på vilket grafdatastrukturen lagras i minnet kallas ”representation”. Grafen kan lagras som en sekventiell representation eller som en länkad representation.
Båda dessa typer beskrivs nedan.
Sekventiell representation
I den sekventiella representationen av grafer använder vi angränsningsmatrisen. En angränsningsmatris är en matris av storlek n x n där n är antalet hörn i diagrammet.
Raderna och kolumnerna i angränsningsmatrisen representerar hörnpunkterna i ett diagram. Matriselementet är inställt på 1 när det finns en kant mellan topparna. Om kanten inte finns, sätts elementet till 0.
Nedan följer ett exempeldiagram som visar dess angränsningsmatris.
Vi har sett angränsningsmatrisen för ovanstående diagram. Observera att eftersom detta är en oriktad graf, och vi kan säga att kanten finns i båda riktningarna. Till exempel, eftersom kant AB är närvarande kan vi dra slutsatsen att kant BA också är närvarande.
I angränsningsmatrisen kan vi se interaktionerna mellan hörnpunkterna som är matriselement som är inställda på 1 när kanten är närvarande och till 0 när kanten saknas.
Låt oss nu se angränsningsmatrisen för en riktad graf.
Som visas ovan kommer skärningselementet i angränsningsmatrisen att vara 1 om och endast om det finns en kant riktad från ett toppunkt till ett annat.
I ovanstående diagram har vi två kanter från vertex A. En kant slutar i topp B medan den andra slutar i topp C.
Därefter ser vi den sekventiella representationen för det viktade diagrammet.
Nedan visas det viktade diagrammet och dess motsvarande angränsningsmatris.
Vi kan se att den sekventiella representationen av ett viktat diagram skiljer sig från andra typer av grafer. Här ersätts värdena som inte är noll i angränsningsmatrisen med kantens faktiska vikt.
Kanten AB har vikt = 4, så i inställningsmatrisen sätter vi skärningspunkten mellan A och B till 4. På samma sätt ändras alla andra värden som inte är noll till deras respektive vikter.
Anslutningslistan är lättare att genomföra och följa. Traversal dvs att kontrollera om det finns en kant från ett toppunkt till ett annat tar O (1) tid och att ta bort en kant tar också O (1).
Oavsett om grafen är gles (färre kanter) eller tät, tar det alltid mer utrymme.
Länkad representation
Vi använder angränsningslistan för den länkade representationen av diagrammet. Representationen för angränsningslistan upprätthåller varje nod i diagrammet och en länk till noder som ligger intill denna nod. När vi korsar alla intilliggande noder sätter vi nästa pekare till null i slutet av listan.
Låt oss först överväga ett oriktat diagram och dess angränsningslista.
Som visas ovan har vi en länkad lista (angränsningslista) för varje nod. Från toppunkt A har vi kanter till toppar B, C och D. Således är dessa noder kopplade till nod A i motsvarande angränsningslista.
Därefter konstruerar vi en angränsningslista för den riktade grafen.
I den ovan riktade grafen ser vi att det inte finns några kanter som kommer från toppunkt E. Därför är angränsningslistan för toppunkt E tom.
Låt oss nu konstruera närhetslistan för det viktade diagrammet.
För ett viktat diagram lägger vi till ett extra fält i anknytningslistanoden för att beteckna kantens vikt som visas ovan.
Det är lättare att lägga till toppunkt i angränsningslistan. Det sparar också utrymme på grund av implementeringen av den länkade listan. När vi behöver ta reda på om det finns en kant mellan ett toppunkt till ett annat är operationen inte effektiv.
Grundläggande funktioner för grafer
Följande är de grundläggande operationerna som vi kan utföra på grafdatastrukturen:
- Lägg till en toppunkt: Lägger till toppunkt i diagrammet.
- Lägg till en kant: Lägger till en kant mellan de två hörnpunkterna i en graf.
- Visa grafhörnpunkterna: Visa hörn i en graf.
C ++ - grafimplementering med hjälp av Adjacency List
Nu presenterar vi en C ++ - implementering för att visa ett enkelt diagram med hjälp av angränsningslistan.
Här ska vi visa angränsningslistan för en vägd riktad graf. Vi har använt två strukturer för att hålla angränsningslistan och kanterna i diagrammet. Intilliggande listan visas som (start_vertex, end_vertex, vikt).
C ++ - programmet är som följer:
cloud computing-leverantörer erbjuder sina tjänster som
#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 Produktion:
Produktion:
Lista över intilliggande diagram
(start_vertex, end_vertex, vikt):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)
Tillämpningar av grafer
Låt oss diskutera några av tillämpningarna av grafer.
- Grafer används i stor utsträckning inom datavetenskap för att skildra nätverksdiagram eller semantiska grafer eller till och med för att skildra beräkningsflödet.
- Grafer används ofta i kompilatorer för att skildra fördelning av resurser till processer eller för att indikera dataflödesanalys etc.
- Grafer används också för frågeoptimering på databasspråk i vissa specialiserade kompilatorer.
- På sociala nätverkssajter är grafer huvudstrukturerna för att skildra nätverket av människor.
- Grafer används i stor utsträckning för att bygga transportsystemet, särskilt vägnätet. Ett populärt exempel är Google-kartor som i stor utsträckning använder grafer för att indikera riktningar över hela världen.
Slutsats
En graf är en populär och i stor utsträckning använd datastruktur som har många applikationer inom datavetenskapliga fält förutom andra områden. Grafer består av hörn och kanter som förbinder två eller flera hörn.
En graf kan riktas eller riktas inte. Vi kan representera grafer med hjälp av angränsande matris som är en linjär representation samt med hjälp av anknytningslänkad lista. Vi diskuterade också implementeringen av diagrammet i denna handledning.
=> Se här för att utforska listan med fullständiga C ++ -studier.
Rekommenderad läsning
- Python Advanced List Tutorial (List Sort, Reverse, Index, Copy, Join, Sum)
- Python List - Skapa, komma åt, skiva, lägga till eller ta bort element
- Standard IP-adresslista för router för vanliga trådlösa routermärken
- 12 bästa verktygen för linjediagram för att skapa fantastiska linjediagram (2021 RANKING)
- Standard routerinloggningslösenord för de bästa routermodellerna (lista 2021)
- Länkad listdatastruktur i C ++ med illustration
- Cirkulär länkad datastruktur i C ++ med illustration
- Dubbelt länkad datastruktur i C ++ med illustration