# -*- Mode: Python -*-

# { <from_node0>: (<to_node0>, <to_node1>, ...), <from_node1>: ... }

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
