CODE

import java.util.*;

class Graph {

    List<String> cities;
    HashMap<String, ArrayList<String>> adjacencyList; 
    
    public Graph(List<String> cities) {
        this.cities = cities;
        adjacencyList = new HashMap<>();

        for (String city : this.cities) {
            adjacencyList.put(city, new ArrayList<>());
        }
    }

    public void addEdge(String source, String destination) {
        this.adjacencyList.get(source).add(destination);
        this.adjacencyList.get(destination).add(source); // comment this line for directed graph
    }

    public void printGraph() {
        System.out.println("Adjacency List of Undirected Graph");
        for (String city : this.cities) {
            System.out.print(city + " => ");
            for(String nbrCity : adjacencyList.get(city)) {
                System.out.print(nbrCity + " ");
            }
            System.out.println();
        }
    }

    public static void main( String args[] ) {
        List<String> cities = new ArrayList<>();
        cities.add("Delhi");
        cities.add("Mumbai");
        cities.add("Bangalore");
        cities.add("Hyderabad");
        Graph g = new Graph(cities);
        g.addEdge("Delhi", "Mumbai");
        g.addEdge("Delhi", "Bangalore");
        g.addEdge("Mumbai", "Hyderabad");
        g.addEdge("Mumbai", "Bangalore");

        g.printGraph();
    }

}
#include<bits/stdc++.h>
using namespace std;

class Graph {
	vector<string> cities;
	unordered_map<string, vector<string>> adjacencyList;

public:
	Graph(vector<string> c) {
		cities = c;
		for(auto city : cities) {
		    vector<string> v;
			adjacencyList[city] = v;
		}
	}

	void addEdge(string source, string destination) {
		adjacencyList.push_back(destination);
		adjacencyList[destination].push_back(source); // comment this line for directed graph
	}

	void printGraph() {
	    cout << "Adjacency List of Undirected Graph" << endl;
	    for (auto city : cities) {
	        cout << city << " => "; 
	        for(auto nbrCity : adjacencyList[city]) {
	        	cout << nbrCity << " ";
	        }
	        cout << endl;
	    }
	}
};

int main() {
	vector<string> cities = {"Delhi", "Mumbai", "Bangalore", "Hyderabad"};
	Graph g(cities);
	g.addEdge("Delhi", "Mumbai");
    g.addEdge("Delhi", "Bangalore");
    g.addEdge("Mumbai", "Hyderabad");
    g.addEdge("Mumbai", "Bangalore");
	g.printGraph();
	return 0;
}
class Graph:

	def __init__(self, cities):
		self.cities = cities
		self.adjacency_list = dict()
		for city in self.cities:
			self.adjacency_list[city] = list()

	def add_edge(self, source, destination):
		self.adjacency_list.append(destination)
		self.adjacency_list[destination].append(source) # comment this line for directed graph

	def print_graph(self):
		print("Adjacency List of Undirected Graph")
		for city in self.cities:
			print(city, " => ", end = " ")
			for nbr_city in self.adjacency_list[city]:
				print(nbr_city, end = " ")
			print()


if __name__ == '__main__':
	
	cities = ["Delhi", "Mumbai", "Bangalore", "Hyderabad"]
	g = Graph(cities);
	g.add_edge("Delhi", "Mumbai")
	g.add_edge("Delhi", "Bangalore")
	g.add_edge("Mumbai", "Hyderabad")
	g.add_edge("Mumbai", "Bangalore")
	g.print_graph()

Output:

Adjacency List of Undirected Graph
Delhi  =>  Mumbai Bangalore 
Mumbai  =>  Delhi Hyderabad Bangalore 
Bangalore  =>  Delhi Mumbai 
Hyderabad  =>  Mumbai