# -*- Mode: Python -*- # { : (, , ...), : ... } g = { 'a': ('b',), 'b': ('c',), 'c': ('d',), 'd': ('b',), } def in_degree (g): r = {} # set every node's in-degree to zero for k, v in g.iteritems(): r[k] = 0 for x in v: r[x] = 0 # every time we find an edge, increment the destination for k, v in g.iteritems(): for x in v: r[x] += 1 return r def find_cycles (g): g = g.copy() while 1: in_d = in_degree (g) for k, v in in_d.iteritems(): if v == 0: # found a node with in-degree of zero. # remove it, along with all edges leaving it. del g[k] break else: return in_d