Int Degree[i] = new int [n];
MaxDegree = 0;
For (i=0 ; i<n ; i++)
{
   Degree[i] = Randomizer Function();
   If (Degree[i] > MaxDegree) MaxDegree = Degree[i];
}
Counts = new int[MaxDegree+1];
For (i=0 ; i<MaxDegree ; i++)
{
   Counts[i] = 0;
}
For (i=0 ; i<n ; i++)
{
   Counts[Degree[i]]++;
}
For (i=MaxDegree,j=0 ; i>=0 ; i--)
{
   For (k=0 ; k<Counts[i] ; k++,j++)
   {
      Degree[j] = i;
   }
}
Delete [] Counts;
W = new int [2*n-1];
B = new int [2*n-1];
R = new int [2*n-1];
For (i=0 ; i<n ; i++)
{
   W[i+n] = Degree[i];
   B[i+n] = W[i+n];
   R[i+n] = 0;
}
Delete [] Degree;
For (i=n-1 ; i>0 ; i--)
{
   Child = i<<1;
   W[i] = W[Child]+R[Child];
   B[i] = W[i];
   Child |= 1;
   R[i] = W[Child]+R[Child];
}
W[0] = W[1]+R[1];
B[0] = W[0];
Delete [] R;
For (Current=0; Current<n ; Current++)
{
   // Remove index corresponding to Current
   Index = Current+n;
   CurrDegree = W[Index];
   W[Index] = 0;
   B[Index] = 0;
   While (Index>1)
   {
      Parent = Index<<1;
      If ((Index&1)==0)
      {
         W[Parent] -= CurrDegree;
         B[Parent] -= CurrDegree;
      }
      Index = Parent;
   }
   W[0] -= CurrDegree;
    B[0] -= CurrDegree;
   // Generate a random Index
   For (i=0 ; i<CurrDegree ; i++)
   {
      P = RAND1(W[0]);
      Node = 1;
      L = 0;
      While (Node < n)
      {
         C=W[Node]+L;
         Child = Node<<1;
         If (p<C)
         {
            B[Node]--;
            Node = Child;
         }
         Else
         {
            L = C;
            Node = Child | 1;
         }
      }
      Other = Node-n;
      Delta = W[Node];
      W[Node] = 0;
      S[SP] = Node;
      SP++;
      While (Node > 1)
      {
         Parent = Node<<1;
         If ((Node&1)==0)
         {
            If (B[Parent] == (W[Parent]-1))
            {
               S[SP] = Parent;
               SP++;
            }
            W[Parent] -= Delta;
         }
      }
      Add Edge from Current to Other
      For (i=0 ; i<SP ; i++)
      {
         W[i] = B[i];
      }
      SP = 0;
   }
}
