CRED models loyalty reward dependencies as a directed graph: an edge u -> v means reward rule u depends on reward rule v. A circular dependency can prevent reward evaluation from completing.
Given the number of reward rules and a list of directed edges, determine whether the graph contains at least one cycle.
Implement has_cycle(n, edges), where n is an integer representing reward rules labeled 0 through n - 1, and edges is a list of two-element lists [u, v] representing a directed edge from u to v. Return True if any directed cycle exists, otherwise return False.
The graph may be disconnected and may contain multiple edges between the same pair of vertices. A self-loop, such as [2, 2], is a cycle.
def has_cycle(n, edges):