import java.util.*; /** * Check whether a given graph is a tree * * Tags: Graph, Tree, DFS */ class IsGraphTree<T> { public static void main(String[] args) { } /** * # of edges = # of vertices - 1 * No cycles, use dfs to do cycle detection * Connected, which means all nodes are visited */ public boolean checkTree(Graph G, Vertex<T> V) { if (G.edges.size() != G.vertices.size() - 1) return false; HashSet<Vertex<T>> set = new HashSet<Vertex<T>>(); boolean hasCycle = dfs(G, V, set); if (hasCycle) return false; if (set.size() != G.vertices.size()) return false; return true; } private boolean dfs(Graph G, Vertex<T> V, HashSet<Vertex<T>> set) { set.add(V); for (Vertex<T> v : V.adjacent) { if (!set.contains(v)) return dfs(G, v, set); else return true; } return false; } class Vertex<T> { T value; List<Vertex<T>> adjacent; } class Graph { List<Vertex> vertices; List<Edge> edges; } class Edge { Vertex src; Vertex dest; } }