graph implementation c using adjacency list
Aquest tutorial explica la implementació de gràfics en C ++. També coneixereu els diferents tipus, representacions i aplicacions de gràfics:
Un gràfic és una estructura de dades no lineal. Un gràfic es pot definir com una col·lecció de nodes que també s'anomenen 'vèrtexs' i 'arestes' que connecten dos o més vèrtexs.
Un gràfic també es pot veure com un arbre cíclic on els vèrtexs no tenen una relació pare-fill, sinó que mantenen una relació complexa entre ells.
avantatges de Linux sobre Windows 10
=> Feu clic aquí per obtenir la sèrie de formació Absolute C ++.
Què aprendreu:
Què és un gràfic a C ++?
Com s’ha dit anteriorment, un gràfic en C ++ és una estructura de dades no lineal definida com una col·lecció de vèrtexs i arestes.
A continuació es mostra un exemple d’estructura de dades de gràfics.
A continuació es mostra un exemple de gràfic G. El gràfic G és un conjunt de vèrtexs {A, B, C, D, E} i un conjunt d’arestes {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Tipus de gràfics: gràfic dirigit i no dirigit
Un gràfic en què les vores no tenen adreces s’anomena gràfic sense direcció. El gràfic que es mostra més amunt és un gràfic sense direcció.
Un gràfic en què les vores tenen direccions associades s’anomena gràfic dirigit.
A continuació es mostra un exemple de gràfic dirigit.
Al gràfic dirigit que es mostra més amunt, les vores formen un parell ordenat en què cada vora representa un camí específic d'un vèrtex a un altre vèrtex. El vèrtex des d’on s’inicia el camí s’anomena “ Node inicial ”Mentre que el vèrtex en què finalitza el camí s’anomena“ Node terminal '.
Així, al gràfic anterior, el conjunt de vèrtexs és {A, B, C, D, E} i el conjunt d’arestes és {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Discutirem la terminologia del gràfic o els termes comuns utilitzats en relació amb el gràfic següent.
Terminologia gràfica
- Vèrtex: Cada node del gràfic s’anomena vèrtex. Al gràfic anterior, A, B, C i D són els vèrtexs del gràfic.
- Vora: L’enllaç o camí entre dos vèrtexs s’anomena vora. Connecta dos o més vèrtexs. Les diferents arestes del gràfic anterior són AB, BC, AD i DC.
- Node adjacent: En un gràfic, si dos nodes estan connectats per una vora, s’anomenen nodes o veïns adjacents. Al gràfic anterior, els vèrtexs A i B estan connectats per la vora AB. Així, A i B són nodes adjacents.
- Grau del node: El nombre d’arestes que estan connectades a un node concret s’anomena grau del node. Al gràfic anterior, el node A té un grau 2.
- Camí: La seqüència de nodes que hem de seguir quan hem de viatjar d’un vèrtex a un altre en un gràfic s’anomena camí. Al nostre gràfic d’exemple, si hem de passar del node A a C, el camí seria A-> B-> C.
- Camí tancat: Si el node inicial és el mateix que un node terminal, aquest camí es denomina camí tancat.
- Camí senzill: Un camí tancat en què tots els altres nodes són diferents s’anomena camí senzill.
- Cicle: Un camí en què no hi ha vores ni vèrtexs repetits i el primer i darrer vèrtex són els mateixos s’anomena cicle. Al gràfic anterior, A-> B-> C-> D-> A és un cicle.
- Gràfic connectat: Un gràfic connectat és aquell en què hi ha un camí entre cadascun dels vèrtexs. Això significa que no hi ha un sol vèrtex que estigui aïllat o sense una vora de connexió. El gràfic que es mostra més amunt és un gràfic connectat.
- Gràfic complet: Un gràfic en el qual cada node està connectat a un altre s’anomena gràfic complet. Si N és el nombre total de nodes d'un gràfic, el gràfic complet conté N (N-1) / 2 nombre d'arestes.
- Gràfic ponderat: Un valor positiu assignat a cada vora que indica la seva longitud (distància entre els vèrtexs connectats per una vora) s’anomena pes. El gràfic que conté arestes ponderades s’anomena gràfic ponderat. El pes d’una vora e es denota per w (e) i indica el cost de recórrer una vora.
- Diagraf: Un dígraf és un gràfic en el qual cada aresta està associada a una direcció específica i el recorregut només es pot fer en una direcció especificada.
Representació de gràfics
La forma en què s'emmagatzema l'estructura de dades de gràfics a la memòria s'anomena 'representació'. El gràfic es pot emmagatzemar com a representació seqüencial o com a representació enllaçada.
Aquests dos tipus es descriuen a continuació.
Representació seqüencial
En la representació seqüencial de gràfics, fem servir la matriu d’adjacència. Una matriu d'adjacència és una matriu de mida n x n on n és el nombre de vèrtexs del gràfic.
Les files i les columnes de la matriu d'adjacència representen els vèrtexs en un gràfic. L'element matricial s'estableix a 1 quan hi ha una vora present entre els vèrtexs. Si la vora no és present, l'element s'estableix a 0.
A continuació es mostra un exemple de gràfic que mostra la seva matriu d'adjacència.
Hem vist la matriu d’adjacència del gràfic anterior. Tingueu en compte que, atès que es tracta d’un gràfic no dirigit, podem dir que l’aresta és present en ambdues direccions. Per exemple, com l'aresta AB és present, podem concloure que l'aresta BA també està present.
A la matriu d’adjacència, podem veure les interaccions dels vèrtexs que són elements de la matriu que s’estableixen a 1 sempre que hi ha la vora i a 0 quan la vora està absent.
Ara vegem la matriu d'adjacència d'un gràfic dirigit.
Com es mostra més amunt, l'element d'intersecció de la matriu d'adjacència serà 1 si i només si hi ha una vora dirigida d'un vèrtex a un altre.
A la gràfica anterior, tenim dues vores del vèrtex A. Una vora finalitza al vèrtex B mentre que la segona acaba al vèrtex C. Així, a la matriu d’adjacència, la intersecció d’A & B s’estableix a 1 com a intersecció d’A & C.
A continuació, veurem la representació seqüencial del gràfic ponderat.
A continuació es mostra el gràfic ponderat i la seva matriu d’adjacència corresponent.
Podem veure que la representació seqüencial d’un gràfic ponderat és diferent dels altres tipus de gràfics. Aquí, els valors diferents de zero a la matriu d’adjacència se substitueixen pel pes real de la vora.
L'aresta AB té un pes = 4, de manera que a la matriu d'adjacència establim la intersecció d'A i B a 4. De la mateixa manera, tots els altres valors diferents de zero es canvien als seus pesos respectius.
La llista d’adjacències és més fàcil d’implementar i de seguir. La transversal és a dir, comprovar si hi ha una vora d’un vèrtex a un altre necessita O (1) temps i treure una vora també necessita O (1).
Tant si el gràfic és escàs (menys arestes) com dens, sempre necessita més espai.
Representació vinculada
Utilitzem la llista d’adjacències per a la representació enllaçada del gràfic. La representació de la llista d’adjacències manté cada node del gràfic i un enllaç als nodes adjacents a aquest node. Quan recorrem tots els nodes adjacents, establim el següent punter a nul al final de la llista.
Considerem primer un gràfic no dirigit i la seva llista d’adjacències.
Com es mostra més amunt, tenim una llista enllaçada (llista d’adjacències) per a cada node. Des del vèrtex A, tenim arestes fins als vèrtexs B, C i D. Així, aquests nodes estan enllaçats amb el node A de la llista d’adjacència corresponent.
A continuació, construïm una llista d'adjacència per al gràfic dirigit.
Al gràfic dirigit anteriorment, veiem que no hi ha arestes originades pel vèrtex E. Per tant, la llista d’adjacència del vèrtex E és buida.
Ara construïm la llista d’adjacència per al gràfic ponderat.
Per a un gràfic ponderat, afegim un camp addicional al node de la llista d’adjacències per indicar el pes de la vora com es mostra a la part anterior.
Afegir més vèrtex a la llista d’adjacències és més fàcil. També estalvia espai a causa de la implementació de la llista enllaçada. Quan hem d’esbrinar si hi ha una vora entre un vèrtex a un altre, l’operació no és eficient.
Operacions bàsiques per a gràfics
A continuació es detallen les operacions bàsiques que podem realitzar a l’estructura de dades del gràfic:
- Afegiu un vèrtex: Afegeix un vèrtex al gràfic.
- Afegiu un avantatge: Afegeix una vora entre els dos vèrtexs d'un gràfic.
- Mostra els vèrtexs del gràfic: Mostra els vèrtexs d'un gràfic.
Implementació de gràfics C ++ mitjançant la llista d’adjacències
Ara presentem una implementació de C ++ per demostrar un gràfic senzill mitjançant la llista d’adjacències.
Aquí mostrarem la llista d’adjacències per a un gràfic dirigit ponderat. Hem utilitzat dues estructures per mantenir la llista d’adjacència i les vores del gràfic. La llista d’adjacències es mostra com (inici_vertex, end_vertex, pes).
El programa C ++ és el següent:
#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 Sortida:
Sortida:
Llista d'adjacència de gràfics
(inici_vertex, final_vertex, pes):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

Aplicacions de gràfics
Analitzem algunes de les aplicacions dels gràfics.
- Els gràfics s’utilitzen àmpliament en informàtica per representar gràfics de xarxa, o gràfics semàntics o fins i tot per representar el flux de càlcul.
- Els gràfics s’utilitzen àmpliament als compiladors per representar l’assignació de recursos als processos o per indicar l’anàlisi del flux de dades, etc.
- Els gràfics també s’utilitzen per a l’optimització de consultes en llenguatges de bases de dades en alguns compiladors especialitzats.
- Als llocs de xarxes socials, els gràfics són les principals estructures per representar la xarxa de persones.
- Els gràfics s’utilitzen àmpliament per construir el sistema de transport, especialment la xarxa de carreteres. Un exemple popular és Google Maps que utilitza àmpliament gràfics per indicar adreces a tot el món.
Conclusió
Un gràfic és una estructura de dades popular i àmpliament utilitzada que té moltes aplicacions en el propi camp de la informàtica a part d'altres camps. Els gràfics consisteixen en vèrtexs i vores que connecten dos o més vèrtexs.
preguntes i respostes d’entrevistes conductuals per a analistes de negocis
Es pot dirigir o no dirigir un gràfic. Podem representar gràfics utilitzant una matriu d’adjacència que és una representació lineal, així com mitjançant una llista enllaçada d’adjacència. També hem comentat la implementació del gràfic en aquest tutorial.
=> Vegeu aquí per explorar la llista completa de tutorials de C ++.
Lectura recomanada
- Tutorial de llista avançada de Python (ordenació de llista, inversió, índex, còpia, unió, suma)
- Llista Python: creeu, accediu, trossegeu, afegiu o suprimiu elements
- Llista d'adreces IP del router per defecte per a les marques de router sense fils més habituals
- 12 millors eines per crear gràfics de línies per crear gràfics de línies impressionants [CLASSIFICACIONS 2021]
- Contrasenya d'inici de sessió predeterminada del router per als millors models de router (llista 2021)
- Estructura de dades de la llista enllaçada en C ++ amb il·lustració
- Estructura de dades de llistes enllaçades circulars en C ++ amb il·lustració
- Estructura de dades de llistes doblement enllaçades en C ++ amb il·lustració