def targeted_order(ugraph):
    """
    Compute a targeted attack order consisting
    of nodes of maximal degree
    
    Returns:
    A list of nodes
    """
    # copy the graph
    new_graph = utility.copy_graph(ugraph)
    
    order = []    
    while len(new_graph) > 0:
        max_degree = -1
        for node in new_graph:
            if len(new_graph[node]) > max_degree:
                max_degree = len(new_graph[node])
                max_degree_node = node
        
        neighbors = new_graph[max_degree_node]
        new_graph.pop(max_degree_node)
        for neighbor in neighbors:
            new_graph[neighbor].remove(max_degree_node)

        order.append(max_degree_node)
    return order
def fast_targeted_order(ugraph):
    graph = utility.copy_graph(ugraph)
    
    degree_set = defaultdict(set)

    for node in graph.keys():            
        degree_set[len(graph[node])].add(node)

    idx = 0
    order = []
    for k in reversed(range(len(graph)-1)) :
        while len(degree_set[k]) != 0:
            node = degree_set[k].pop()
            neighbors = graph[node]
            for neighbor in neighbors:
                d = len(graph[neighbor])
                degree_set[d].discard(neighbor)
                degree_set[d-1].add(neighbor)

            order.append(node)
            utility.delete_node(graph, node)
            
    return order;