graph implementation c using adjacency list
Denne opplæringen forklarer implementeringen av grafer i C ++. Du vil også lære om forskjellige typer, representasjoner og anvendelser av grafer:
En graf er en ikke-lineær datastruktur. En graf kan defineres som en samling av noder som også kalles 'hjørner' og 'kanter' som forbinder to eller flere hjørner.
En graf kan også sees på som et syklisk tre der hjørnene ikke har et foreldre-barn-forhold, men opprettholder et komplekst forhold mellom dem.
er nettverkssikkerhetsnøkkelen det samme som passordet
=> Klikk her for den absolutte C ++ treningsserien.
Hva du vil lære:
Hva er en graf i C ++?
Som nevnt ovenfor er en graf i C ++ en ikke-lineær datastruktur definert som en samling av hjørner og kanter.
Følgende er et eksempel på en grafstruktur.
Ovenfor er et eksempel på graf G. Graf G er et sett med hjørner {A, B, C, D, E} og et sett med kanter {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Typer av grafer - Regissert og ikke-dirigert graf
En graf der kantene ikke har retninger, kalles den ikke-dirigerte grafen. Grafen vist ovenfor er en ikke-rettet graf.
En graf der kantene har retninger assosiert med seg, kalles en rettet graf.
Nedenfor er et eksempel på en rettet graf.
I den rettede grafen vist ovenfor, danner kanter et ordnet par hvor hver kant representerer en spesifikk bane fra et toppunkt til et annet toppunkt. Toppunktet som stien begynner fra kalles “ Innledende node ”Mens toppunktet som stien ender i kalles“ Terminal Node ”.
I grafen ovenfor er settet med hjørner {A, B, C, D, E} og settet med kanter er {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Vi vil diskutere grafterminologien eller de vanlige begrepene som brukes i forhold til grafen nedenfor.
Grafterminologi
- Vertex: Hver node i grafen kalles toppunkt. I grafen ovenfor er A, B, C og D toppunktene i grafen.
- Kant: Koblingen eller banen mellom to hjørner kalles en kant. Den forbinder to eller flere hjørner. De forskjellige kantene i grafen ovenfor er AB, BC, AD og DC.
- Tilstøtende node: I en graf, hvis to noder er forbundet med en kant, kalles de tilstøtende noder eller naboer. I ovenstående graf er hjørnene A og B forbundet med kanten AB. Dermed er A og B tilstøtende noder.
- Graden av noden: Antall kanter som er koblet til en bestemt node kalles graden av noden. I grafen ovenfor har node A en grad 2.
- Sti: Sekvensen av noder som vi trenger å følge når vi må reise fra ett toppunkt til et annet i en graf kalles banen. I vårt eksempelgraf, hvis vi trenger å gå fra node A til C, vil banen være A-> B-> C.
- Stengt sti: Hvis den opprinnelige noden er den samme som en terminalnode, blir den banen betegnet som den lukkede banen.
- Enkel vei: En lukket sti der alle de andre nodene er forskjellige kalles en enkel sti.
- Syklus: En bane der det ikke er gjentatte kanter eller hjørner, og de første og siste hjørnene er de samme, kalles en syklus. I grafen ovenfor er A-> B-> C-> D-> A en syklus.
- Tilkoblet graf: En tilkoblet graf er den der det er en sti mellom hver av toppunktene. Dette betyr at det ikke er et eneste toppunkt som er isolert eller uten en tilkoblingskant. Grafen vist ovenfor er en sammenhengende graf.
- Komplett graf: En graf der hver node er koblet til en annen kalles komplett graf. Hvis N er totalt antall noder i en graf, inneholder den komplette grafen N (N-1) / 2 antall kanter.
- Vektet graf: En positiv verdi tildelt hver kant som indikerer lengden (avstanden mellom toppene forbundet med en kant) kalles vekt. Grafen som inneholder vektede kanter kalles en vektet graf. Vekten av en kant e er betegnet med w (e) og det indikerer kostnaden for å krysse en kant.
- Avsnitt: En digraf er en graf der hver kant er assosiert med en bestemt retning, og traversal kan bare gjøres i spesifisert retning.
Grafrepresentasjon
Måten grafstrukturen lagres i minnet kalles 'representasjon'. Grafen kan lagres som en sekvensiell representasjon eller som en koblet representasjon.
Begge disse typene er beskrevet nedenfor.
Sekvensiell representasjon
I den sekvensielle representasjonen av grafer bruker vi adjacency matrix. En tilknytningsmatrise er en matrise av størrelse n x n der n er antall hjørner i grafen.
Radene og kolonnene i tilknytningsmatrisen representerer toppunktene i en graf. Matriseelementet er satt til 1 når det er en kant til stede mellom toppunktene. Hvis kanten ikke er tilstede, blir elementet satt til 0.
Nedenfor er et eksempel på en graf som viser dens nærhetsmatrise.
Vi har sett nærhetsmatrisen for grafen ovenfor. Merk at siden dette er en ikke-rettet graf, kan vi si at kanten er tilstede i begge retninger. For eksempel, ettersom kant AB er til stede, kan vi konkludere med at kant BA også er til stede.
I tilknytningsmatrisen kan vi se samspillet mellom toppunktene som er matriseelementer som er satt til 1 når kanten er tilstede og til 0 når kanten ikke er til stede.
La oss nå se nærhetsmatrisen til en rettet graf.
Som vist ovenfor vil skjæringselementet i nærhetsmatrisen være 1 hvis og bare hvis det er en kant rettet fra ett toppunkt til et annet.
I den ovennevnte grafen har vi to kanter fra toppunkt A. Den ene kanten slutter til toppunkt B mens den andre slutter til toppunkt C. Dermed blir krysset mellom A og B i tilgrensende matrise satt til 1 som skjæringspunktet mellom A og C.
Deretter vil vi se den sekvensielle representasjonen for den vektede grafen.
Nedenfor er den vektede grafen og dens tilhørende nærhetsmatrise.
Vi kan se at den sekvensielle representasjonen av en vektet graf er forskjellig fra de andre typene grafer. Her erstattes verdiene som ikke er null i nærhetsmatrisen med kantens faktiske vekt.
Kanten AB har vekt = 4, og dermed setter vi skjæringspunktet mellom A og B i 4. Tilpasningsmatrisen. Tilsvarende endres alle de andre ikke-nullverdiene til deres respektive vekter.
Tilstøtningslisten er lettere å implementere og følge. Traversal dvs. å sjekke om det er en kant fra et toppunkt til et annet tar O (1) tid og å fjerne en kant tar også O (1).
Enten grafen er sparsom (færre kanter) eller tett, tar det alltid mer plass.
Tilknyttet representasjon
Vi bruker tilknytningslisten for den koblede representasjonen av grafen. Representasjonen for tilknytningslisten opprettholder hver node i grafen og en lenke til nodene som ligger ved siden av denne noden. Når vi krysser alle tilstøtende noder, setter vi neste peker til null på slutten av listen.
La oss først vurdere en ikke-rettet graf og dens tilknytningsliste.
Som vist ovenfor har vi en koblet liste (nærhetsliste) for hver node. Fra toppunkt A har vi kanter til toppunktene B, C og D. Dermed knyttes disse nodene til node A i den tilsvarende nærhetslisten.
Deretter konstruerer vi en nærhetsliste for den dirigerte grafen.
I den ovenfor rettet grafen ser vi at det ikke er noen kanter som kommer fra toppunkt E. Derfor er nærhetslisten for toppunkt E tom.
La oss nå konstruere nærhetslisten for den vektede grafen.
For en vektet graf legger vi til et ekstra felt i nærhetslistenoden for å betegne kantens vekt som vist ovenfor.
Det er lettere å legge til toppunkt i adjacency-listen. Det sparer også plass på grunn av implementeringen av den koblede listen. Når vi trenger å finne ut om det er en kant mellom et toppunkt til et annet, er ikke operasjonen effektiv.
Grunnleggende operasjoner for grafer
Følgende er de grunnleggende operasjonene vi kan utføre på grafdatastrukturen:
beste gratis fjerning av virus og skadelig programvare
- Legg til et toppunkt: Legger til toppunkt i grafen.
- Legg til en kant: Legger til en kant mellom de to hjørnene i en graf.
- Vis kurvene: Vis hjørnene i en graf.
C ++ Implementering av graf ved hjelp av Adjacency List
Nå presenterer vi en C ++ implementering for å demonstrere en enkel graf ved hjelp av adjacency listen.
Her skal vi vise nærhetslisten for en vektet rettet graf. Vi har brukt to strukturer for å holde tilknytningslisten og kantene på grafen. Støttelisten vises som (start_vertex, end_vertex, vekt).
C ++ - programmet er som følger:
#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 Produksjon:
Produksjon:
Liste over tilstøtningsdiagrammer
(start_vertex, end_vertex, vekt):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

Anvendelser av grafer
La oss diskutere noen av anvendelsene av grafer.
- Grafer brukes mye i informatikk for å skildre nettverksgrafer, eller semantiske grafer eller til og med for å skildre strømmen av beregning.
- Grafer er mye brukt i kompilatorer for å skildre tildeling av ressurser til prosesser eller for å indikere dataflytanalyse, etc.
- Grafer brukes også til spørreoptimalisering i databasespråk i noen spesialiserte kompilatorer.
- På sosiale nettverk er grafer hovedstrukturene for å skildre nettverket av mennesker.
- Grafer blir mye brukt for å bygge transportsystemet, spesielt veinettet. Et populært eksempel er Google maps som i stor utstrekning bruker grafer for å indikere retninger over hele verden.
Konklusjon
En graf er en populær og mye brukt datastruktur som har mange applikasjoner innen selve datavitenskapen, bortsett fra andre felt. Grafer består av hjørner og kanter som forbinder to eller flere hjørner.
En graf kan rettes eller ikke rettes. Vi kan representere grafer ved hjelp av tilknytningsmatrise som er en lineær representasjon, samt ved hjelp av tilknytningsliste. Vi diskuterte også implementeringen av grafen i denne opplæringen.
=> Se her for å utforske hele C ++ opplæringslisten.
Anbefalt lesing
- Python Advanced List Tutorial (List Sort, Reverse, Index, Copy, Join, Sum)
- Python-liste - Opprett, tilgang, del opp, legg til eller slett elementer
- Standard router IP-adresseliste for vanlige trådløse rutemerker
- 12 beste verktøy for linjediagramskapere for å lage fantastiske linjediagrammer (2021 RANGER)
- Standard rutepåloggingspassord for de beste rutermodellene (2021-liste)
- Koblet liste Datastruktur i C ++ med illustrasjon
- Sirkulær koblet liste Datastruktur i C ++ med illustrasjon
- Dobbeltkoblet liste Datastruktur i C ++ med illustrasjon