Suppose we have a **large directed graph** $G$, for example, containing about 2000 nodes and about 10 edges per node. Now we need to achieve these goals as quickly as possible: 1. Find a **random cycle** $R$ in this graph. The '*Random*' means no matter how big the cycle is, all the possible cycles should be picked with the **same probabilities**. (To be clear, a cycle means a directed close cycle) **If there is no cycle in this graph, then stop and exit**. 2. After finding the random cycle, we **reverse** this cycle $R$, which means this cycle will be changed to another direction. Now how should we find a random cycle on this new graph $G'$. 3. The step 1 and step 2 can be invoked for many times, please find a proper way to store the graph and find a random cycle easily. **It's okay to preprocess the graph for a long time, but what I want is to ensure that the step 1 and step 2 could be as quickly as possible.** For example, now we have a graph: $$ \require{AMScd} \begin{CD} 1 @>>> 2\\ @AAA \nwarrow @VVV\\ 4 @<<< 3 \end{CD} $$ First we need to find a random cycle, and there are two cycles in this graph. Suppose we get this one. $$ \require{AMScd} \begin{CD} 1 @>>> 2\\ & \nwarrow @VVV\\ & & 3 \end{CD} $$ Then, after reversing the first cycle, the graph becomes: $$ \require{AMScd} \begin{CD} 1 @<<< 2\\ @AAA \searrow @AAA\\ 4 @<<< 3 \end{CD} $$ When we get a random cycle on this graph, there are two cycles that we can choose: 1. $$ \require{AMScd} \begin{CD} 1 @<<< 2\\ & \searrow @AAA\\ & & 3 \end{CD} $$ 2. $$ \require{AMScd} \begin{CD} 1 & \\ @AAA \searrow &\\ 4 @<<< 3 \end{CD} $$