1. Compute and draw the adjacency matrix and adjacency list representations of the above graph. (2 pts) 2. Does the above graph have an Eulerian path (a path that visits every edge exactly once? What is your criteria for deciding existence of an Eulerian path? (2 pts) 3. Consider the following Graph class partial implementation. Implement the missing functions. (5 pts) 4. Using your implemented code below draw the dfs tree starting from node 4 of the above graph. (1 pts) public class Graph { int n;// number of vertices int m;// number of edges // vertices labeled from 0 to (n1) int[]] A; // adjacency matrix boolean[] visited; // to track dfs searched vertices int[] parent; int[] degree; // degree of each vertex public Graph(int n, String[] edges) { this. n=n; this.m = edges.length; A=new int [n][n]; for (int u=0;u<n;u++ ) { for (int v=0;v<n;v++){ A[u][v]=0;// implement depth first search from node u public void dfs(int u ) { // TODO: code goes here to implement DFS } public void printAdjMatrix() { for (int u=0;u<n;u++ ) { for (int v=0;v<n;v++ ) { System.out.print(A[u] [ v]+ " ); } System.out.println(); } } public void printParentTree() { for (int u=0;u<n;u++ ) { System.out.print(parent[u] +" "); } System.out.print ln(); } // test whether sum of degrees equals twice the number of edges boolean checkHandshakingLemma() { // TODO: code goes here to check handshaking lemma } // test whether the graph has an eulerian path boolean testEulerian () { // TODO: code goes here to check for existence of eulerian path }.