public static bool IsTree <TVertex>(this IVertexAndEdgeListGraph <TVertex, Edge <TVertex> > graph) { if (graph.Edges.Any(e => e.IsSelfEdge <TVertex, Edge <TVertex> >())) { return(false); } if (graph.VertexCount == 0) { return(true); } var undirectedGraph = new UndirectedGraph <TVertex, Edge <TVertex> >(true); graph.Clone(v => v, (e, src, tgt) => e, undirectedGraph); var dfs = new UndirectedDepthFirstSearchAlgorithm <TVertex, Edge <TVertex> >(undirectedGraph); var foundBackEdge = false; dfs.BackEdge += delegate { foundBackEdge = true; }; dfs.Compute(); return(!foundBackEdge); }