Design an algorithm which can automatically indicate whether
Solution
(a)
    define visit(node n):
       if n.colour == grey: //if we\'re still visiting this node or its descendants
         throw exception(\"Cycle found\")
      n.colour = grey //to indicate this node is being visited
       for node child in n.children():
         if child.colour == white: //if the child is unexplored
           visit(child)
      n.colour = black //to show we\'re done visiting this node
       return
       Both (i) and (ii) can be done using Doubly linked list data structure
            keeping each connected node to each of each node as head.
            like in case of (i)
                x1 -> y1,y2
                x2 -> y1,y2
                x3 -> y1,y3
(b)
    DFS is an algorithm to traverse a graph, meaning it goes to all the nodes in the same connected component as the starting node. If we traverse the graph from a starting node and we find out that other nodes, after the traversal ends, have not been visited, this means that the graph is not connected.
    pseudocode :
    void dfs(int v){ //You can run DFS on any arbitrary node
                         if vis[v] is true: //don\'t visit the same node twice
                             return
                         set vis[v] as true
                         for all neighbors u of v: //DFS to all the neighbors
                             if vis[u] is false: //check if you visited it before
                                 dfs(u)
    }
 
 
    bool connected(){ //Run DFS first
         for all nodes u:
             if vis[u] is false: //DFS did not reach this node
                 return false
         return true
    }
    An undirected graph is tree if it has following properties.
    1) There is no cycle.
    2) The graph is connected.
   So, in the example we can see that the graph is not connected. since after traveral nodes are left unvisited.
        here for example if the traversal starts from A, B, C, E, F or I then D, H and G are not visited.
        Similarly if the traversal starts from D, H or G then A, B, C, E, F and I are not visited.
and since it is graph is not connected, the graph is not a tree. (as given in the second condition of the graph to be tree)

