G1 = { 1: [2, 5], 2: [1, 3], 5: [4] } G2 = { 1: [2, 4], 2: [3, 4], 3: [5], 5: [2, 6] } G3 = { 1: [2, 5], 2: [3], 5: [4] } def count_vertices(G): return len(set(G.keys()).union(e for es in G.values() for e in es)) def count_edges(G): return len([e for es in G.values() for e in es]) def topological_sort(G): sorted_graph = [] unsorted_graph = dict(G.items()) while unsorted_graph: acyclic = False for (node, edges) in list(unsorted_graph.items()): for edge in edges: if edge in unsorted_graph: break else: acyclic = True del unsorted_graph[node] sorted_graph.append((node, edges)) if not acyclic: return None return sorted_graph def iscyclic(G): return topological_sort(G) is None def test_count_vertices(): assert count_vertices(G1) == 5 assert count_vertices(G2) == 6 assert count_vertices(G3) == 5 def test_count_edges(): assert count_edges(G1) == 5 assert count_edges(G2) == 7 assert count_edges(G3) == 4 def test_iscyclic(): assert iscyclic(G1) == True assert iscyclic(G2) == True assert iscyclic(G3) == False