graph implementation c using adjacency list
Questo tutorial spiega l'implementazione dei grafici in C ++. Imparerai anche a conoscere diversi tipi, rappresentazioni e applicazioni di grafici:
Un grafico è una struttura dati non lineare. Un grafo può essere definito come una raccolta di nodi chiamati anche 'vertici' e 'bordi' che collegano due o più vertici.
Un grafo può anche essere visto come un albero ciclico in cui i vertici non hanno una relazione genitore-figlio ma mantengono una relazione complessa tra di loro.
unix shell scripting intervista domande e risposte per esperti
=> Fare clic qui per la serie di formazione Absolute C ++.
Cosa imparerai:
Che cos'è un grafico in C ++?
Come affermato sopra, un grafico in C ++ è una struttura dati non lineare definita come una raccolta di vertici e bordi.
Di seguito è riportato un esempio di una struttura dati del grafico.
Dato sopra è un esempio di grafo G. Il grafico G è un insieme di vertici {A, B, C, D, E} e un insieme di archi {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Tipi di grafici: grafico diretto e non orientato
Un grafico in cui i bordi non hanno direzioni è chiamato grafico non orientato. Il grafico mostrato sopra è un grafico non orientato.
Un grafico in cui i bordi hanno direzioni associate ad essi è chiamato grafico orientato.
Di seguito è riportato un esempio di un grafico diretto.
Nel grafico diretto mostrato sopra, i bordi formano una coppia ordinata in cui ogni bordo rappresenta un percorso specifico da un vertice a un altro vertice. Il vertice da cui inizia il percorso si chiama ' Nodo iniziale 'Mentre il vertice in cui termina il percorso è chiamato' Terminal Node '.
Così nel grafico sopra, l'insieme dei vertici è {A, B, C, D, E} e l'insieme degli archi è {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Discuteremo la terminologia del grafico oi termini comuni usati in relazione al grafico sottostante.
Terminologia dei grafici
- Vertice: Ogni nodo del grafo è chiamato vertice. Nel grafico sopra, A, B, C e D sono i vertici del grafico.
- Bordo: Il collegamento o percorso tra due vertici è chiamato bordo. Collega due o più vertici. I diversi bordi nel grafico sopra sono AB, BC, AD e DC.
- Nodo adiacente: In un grafico, se due nodi sono collegati da un bordo, vengono chiamati nodi adiacenti o vicini. Nel grafico sopra, i vertici A e B sono collegati dal bordo AB. Quindi A e B sono nodi adiacenti.
- Grado del nodo: Il numero di bordi che sono collegati a un particolare nodo è chiamato il grado del nodo. Nel grafico sopra, il nodo A ha un grado 2.
- Sentiero: La sequenza di nodi che dobbiamo seguire quando dobbiamo viaggiare da un vertice all'altro in un grafo è chiamata percorso. Nel nostro grafico di esempio, se dobbiamo andare dal nodo A a C, il percorso sarà A-> B-> C.
- Percorso chiuso: Se il nodo iniziale è lo stesso di un nodo terminale, quel percorso viene definito percorso chiuso.
- Percorso semplice: Un percorso chiuso in cui tutti gli altri nodi sono distinti è chiamato percorso semplice.
- Ciclo: Un percorso in cui non ci sono spigoli o vertici ripetuti e il primo e l'ultimo vertice sono uguali è chiamato ciclo. Nel grafico sopra, A-> B-> C-> D-> A è un ciclo.
- Grafico connesso: Un grafo connesso è quello in cui esiste un percorso tra ciascuno dei vertici. Ciò significa che non esiste un singolo vertice isolato o senza un bordo di collegamento. Il grafico mostrato sopra è un grafico connesso.
- Grafico completo: Un grafico in cui ogni nodo è connesso a un altro è chiamato grafico completo. Se N è il numero totale di nodi in un grafico, il grafico completo contiene N (N-1) / 2 numero di archi.
- Grafico ponderato: Un valore positivo assegnato a ciascun bordo indicante la sua lunghezza (distanza tra i vertici collegati da un bordo) è chiamato peso. Il grafico contenente i bordi ponderati è chiamato grafico ponderato. Il peso di un bordo e è indicato con w (e) e indica il costo di attraversamento di un bordo.
- Diagramma: Un digraph è un grafico in cui ogni bordo è associato a una direzione specifica e l'attraversamento può essere eseguito solo nella direzione specificata.
Rappresentazione grafica
Il modo in cui la struttura dei dati del grafico viene archiviata in memoria è chiamato 'rappresentazione'. Il grafico può essere memorizzato come rappresentazione sequenziale o come rappresentazione collegata.
Entrambi questi tipi sono descritti di seguito.
Rappresentazione sequenziale
Nella rappresentazione sequenziale dei grafici, usiamo la matrice di adiacenza. Una matrice di adiacenza è una matrice di dimensione n x n dove n è il numero di vertici nel grafo.
Le righe e le colonne della matrice di adiacenza rappresentano i vertici in un grafo. L'elemento della matrice è impostato a 1 quando è presente un bordo tra i vertici. Se il bordo non è presente, l'elemento viene impostato a 0.
Di seguito è riportato un grafico di esempio che mostra la sua matrice di adiacenza.
Abbiamo visto la matrice di adiacenza per il grafico sopra. Nota che poiché questo è un grafo non orientato, e possiamo dire che il bordo è presente in entrambe le direzioni. Per esempio, poiché l'arco AB è presente, possiamo concludere che è presente anche l'arco BA.
Nella matrice di adiacenza, possiamo vedere le interazioni dei vertici che sono elementi della matrice che sono posti a 1 ogni volta che il bordo è presente e a 0 quando il bordo è assente.
Vediamo ora la matrice di adiacenza di un grafo orientato.
Come mostrato sopra, l'elemento di intersezione nella matrice di adiacenza sarà 1 se e solo se c'è un bordo diretto da un vertice all'altro.
Nel grafico sopra, abbiamo due archi dal vertice A. Un arco termina nel vertice B mentre il secondo termina nel vertice C.Quindi nella matrice di adiacenza l'intersezione di A e B è impostata a 1 come intersezione di A e C.
Successivamente, vedremo la rappresentazione sequenziale per il grafico pesato.
Di seguito è riportato il grafico ponderato e la corrispondente matrice di adiacenza.
Possiamo vedere che la rappresentazione sequenziale di un grafico ponderato è diversa dagli altri tipi di grafici. Qui, i valori diversi da zero nella matrice di adiacenza vengono sostituiti dal peso effettivo del bordo.
Il bordo AB ha peso = 4, quindi nella matrice di adiacenza, impostiamo l'intersezione di A e B su 4. Allo stesso modo, tutti gli altri valori diversi da zero vengono modificati nei rispettivi pesi.
L'elenco delle adiacenze è più facile da implementare e da seguire. Traversal, cioè per verificare se c'è un bordo da un vertice a un altro, richiede O (1) tempo e anche la rimozione di un bordo richiede O (1).
Indipendentemente dal fatto che il grafico sia scarso (meno bordi) o denso, richiede sempre più spazio.
come aprire i file dat in Windows
Rappresentanza collegata
Usiamo l'elenco di adiacenza per la rappresentazione collegata del grafico. La rappresentazione della lista di adiacenza mantiene ogni nodo del grafo e un collegamento ai nodi che sono adiacenti a questo nodo. Quando attraversiamo tutti i nodi adiacenti, impostiamo il puntatore successivo su null alla fine della lista.
Consideriamo prima un grafo non orientato e la sua lista di adiacenza.
Come mostrato sopra, abbiamo un elenco collegato (elenco di adiacenza) per ogni nodo. Dal vertice A, abbiamo i bordi ai vertici B, C e D. Quindi questi nodi sono collegati al nodo A nella lista di adiacenza corrispondente.
Successivamente, costruiamo una lista di adiacenza per il grafo diretto.
Nel grafo sopra diretto, vediamo che non ci sono archi che originano dal vertice E. Quindi l'elenco di adiacenza per il vertice E è vuoto.
Costruiamo ora l'elenco di adiacenza per il grafo pesato.
Per un grafico ponderato, aggiungiamo un campo extra nel nodo dell'elenco di adiacenza per denotare il peso del bordo come mostrato sopra.
L'aggiunta di vertici nell'elenco delle adiacenze è più semplice. Inoltre, consente di risparmiare spazio grazie all'implementazione dell'elenco collegato. Quando abbiamo bisogno di scoprire se c'è un bordo tra un vertice e l'altro, l'operazione non è efficiente.
Operazioni di base per i grafici
Di seguito sono riportate le operazioni di base che possiamo eseguire sulla struttura dati del grafico:
- Aggiungi un vertice: Aggiunge vertice al grafico.
- Aggiungi un bordo: Aggiunge un bordo tra i due vertici di un grafo.
- Visualizza i vertici del grafico: Visualizza i vertici di un grafico.
Implementazione di grafici C ++ utilizzando l'elenco di adiacenze
Ora presentiamo un'implementazione C ++ per dimostrare un semplice grafico utilizzando l'elenco di adiacenza.
Qui mostreremo l'elenco delle adiacenze per un grafico orientato ponderato. Abbiamo utilizzato due strutture per contenere l'elenco di adiacenza e i bordi del grafico. L'elenco delle adiacenze viene visualizzato come (start_vertex, end_vertex, weight).
Il programma C ++ è il seguente:
#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 Produzione:
Produzione:
Elenco di adiacenza del grafico
(start_vertex, end_vertex, weight):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)
Applicazioni dei grafici
Parliamo di alcune delle applicazioni dei grafici.
- I grafici sono ampiamente utilizzati in informatica per rappresentare grafici di rete, o grafici semantici o anche per rappresentare il flusso di calcolo.
- I grafici sono ampiamente utilizzati nei compilatori per rappresentare l'allocazione delle risorse ai processi o per indicare l'analisi del flusso di dati, ecc.
- I grafici vengono utilizzati anche per l'ottimizzazione delle query nei linguaggi di database in alcuni compilatori specializzati.
- Nei siti di social networking, i grafici sono le principali strutture per rappresentare la rete di persone.
- I grafici sono ampiamente utilizzati per costruire il sistema di trasporto, in particolare la rete stradale. Un esempio popolare è Google Maps che utilizza ampiamente i grafici per indicare le direzioni in tutto il mondo.
Conclusione
Un grafico è una struttura dati popolare e ampiamente utilizzata che ha molte applicazioni nel campo stesso dell'informatica oltre ad altri campi. I grafici sono costituiti da vertici e bordi che collegano due o più vertici.
Un grafico può essere diretto o non orientato. Possiamo rappresentare i grafici usando la matrice di adiacenza che è una rappresentazione lineare così come usando la lista collegata di adiacenza. Abbiamo anche discusso l'implementazione del grafico in questo tutorial.
=> Vedi qui per esplorare l'elenco completo dei tutorial C ++.
Lettura consigliata
- Python Advanced List Tutorial (List Sort, Reverse, Index, Copy, Join, Sum)
- Elenco Python: crea, accedi, seziona, aggiungi o elimina elementi
- Elenco degli indirizzi IP del router predefinito per le marche comuni di router wireless
- 12 migliori strumenti per la creazione di grafici a linee per creare grafici a linee sbalorditivi (CLASSIFICHE 2021)
- Password di accesso al router predefinita per i modelli di router principali (elenco 2021)
- Struttura Dati Elenco Collegato In C ++ Con Illustrazione
- Struttura Dati Elenco Collegato Circolare In C ++ Con Illustrazione
- Struttura dei dati della lista doppiamente collegata in C ++ con illustrazione