Open In App

Adjacency List Representation

Last Updated : 07 Nov, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Share
Report
News Follow

An adjacency list is a data structure used to represent a graph where each node in the graph stores a list of its neighboring vertices.

1. Adjacency List for Directed graph:

Consider an Directed and Unweighted graph with 3 vertices and 3 edges. For the graph G, the adjacency list would look like:


C++
#include <iostream>
#include <vector>
using namespace std;

// Function to add an edge between two vertices
void addEdge(vector<vector<int>>& adj, int u, int v) {
    adj[u].push_back(v);
}

void displayAdjList(const vector<vector<int>>& adj) {
    for (int i = 0; i < adj.size(); i++) {
        cout << i << ": "; 
        for (int j : adj[i]) {
            cout << j << " "; 
        }
        cout << endl; 
    }
}

int main() {
  
    // Create a graph with 3 vertices and 3 edges
    int V = 3;
    vector<vector<int>> adj(V); 

    // Now add edges one by one
    addEdge(adj, 1, 0);
    addEdge(adj, 1, 2);
    addEdge(adj, 2, 0);

    cout << "Adjacency List Representation:" << endl;
    displayAdjList(adj);

    return 0;
}
Java Python C# JavaScript

Output
Adjacency List Representation:
0: 
1: 0 2 
2: 0 

2. Adjacency List for Undirected graph:

Consider an Undirected and Unweighted graph with 3 vertices and 3 edges. For the graph G, the adjacency list would look like:


C++
#include <iostream>
#include <vector>
using namespace std;

// Function to add an edge between two vertices
void addEdge(vector<vector<int>>& adj, int u, int v) {
    adj[u].push_back(v);
  	adj[v].push_back(u);
}

void displayAdjList(vector<vector<int>>& adj) {
    for (int i = 0; i < adj.size(); i++) {
        cout << i << ": "; 
        for (int j : adj[i]) {
            cout << j << " "; 
        }
        cout << endl; 
    }
}

int main() {
  
    // Create a graph with 3 vertices and 3 edges
    int V = 3;
    vector<vector<int>> adj(V); 

    // Now add edges one by one
    addEdge(adj, 1, 0);
    addEdge(adj, 1, 2);
    addEdge(adj, 2, 0);

    cout << "Adjacency List Representation:" << endl;
    displayAdjList(adj);

    return 0;
}
Java Python C# JavaScript

Output
Adjacency List Representation:
0: 1 2 
1: 0 2 
2: 1 0 

3. Adjacency List for Directed and Weighted graph:

Consider an Directed and Weighted graph with 3 vertices and 3 edges. For the graph G, the adjacency list would look like:


C++
#include <iostream>
#include <vector>
using namespace std;

// Function to add an edge between two vertices
void addEdge(vector<vector<pair<int,int>>>& adj, int u, int v, int w) {
    adj[u].push_back({v,w});
}

void displayAdjList(vector<vector<pair<int,int>>>& adj) {
    for (int i = 0; i < adj.size(); i++) {
        cout << i << ": "; 
        for (auto &j : adj[i]) {
            cout << "{"<<j.first << ", "<<j.second<<"} "; 
        }
        cout << endl; 
    }
}

int main() {
  
    // Create a graph with 3 vertices and 3 edges
    int V = 3;
    vector<vector<pair<int,int>>> adj(V); 

    // Now add edges one by one
    addEdge(adj, 1, 0, 4);
    addEdge(adj, 1, 2, 3);
    addEdge(adj, 2, 0, 1);

    cout << "Adjacency List Representation:" << endl;
    displayAdjList(adj);

    return 0;
}
Java Python C# JavaScript

Output
Adjacency List Representation:
0: 
1: {0, 4} {2, 3} 
2: {0, 1} 

4. Adjacency List for Undirected and Weighted graph:

Consider an Undirected and Weighted graph with 3 vertices and 3 edges. For the graph G, the adjacency list would look like:


C++
#include <iostream>
#include <vector>
using namespace std;

// Function to add an edge between two vertices
void addEdge(vector<vector<pair<int,int>>>& adj, int u, int v, int w) {
    adj[u].push_back({v,w});
  	adj[v].push_back({u,w});
}

// Function to display the adjacency list
void displayAdjList(vector<vector<pair<int,int>>>& adj) {
    for (int i = 0; i < adj.size(); i++) {
        cout << i << ": "; 
        for (auto &j : adj[i]) {
            cout << "{"<<j.first << ", "<<j.second<<"} "; 
        }
        cout << endl; 
    }
}

int main() {
  
    // Create a graph with 3 vertices and 3 edges
    int V = 3;
    vector<vector<pair<int,int>>> adj(V); 

    // Now add edges one by one
    addEdge(adj, 1, 0, 4);
    addEdge(adj, 1, 2, 3);
    addEdge(adj, 2, 0, 1);

    cout << "Adjacency List Representation:" << endl;
    displayAdjList(adj);

    return 0;
}
Java Python C# JavaScript

Output
Adjacency List Representation:
0: {1, 4} {2, 1} 
1: {0, 4} {2, 3} 
2: {1, 3} {0, 1} 

Characteristics of the Adjacency List:

  • An adjacency list representation uses a list of lists. We store all adjacent of every node together.
  • The size of the list is determined by the number of vertices in the graph.
  • All adjacent of a vertex are easily available. To find all adjacent, we need only O(n) time where is the number of adjacent vertices.

Applications of the Adjacency List:

Advantages of using an Adjacency list:

  • An adjacency list is simple and easy to understand.
  • Requires less space compared to adjacency matrix for sparse graphs.
  • Easy to traverse through all edges of a graph.
  • Adding an vertex is easier compared to adjacency matrix representation.
  • Most of the graph algorithms are implemented faster with this representation. For example, BFS and DFS implementations take OIV x V) time, but with Adjacency List representation, we get these in linear time. Similarly Prim’s and Dijskstra’s algorithms are implemented faster with Adjacency List representation.

Disadvantages of using an Adjacency list:

  • Checking if there is an edge between two vertices is costly as we have traverse the adjacency list.
  • Not suitable for dense graphs.

What else can you read?



Next Article
Practice Tags :

Similar Reads

three90RightbarBannerImg