PROCEDURE DepthLabel( coins: Random.T; READONLY e: ARRAY OF Edge; VAR uLab, vLab: ARRAY OF CARDINAL; ) = VAR uTop, vTop: CARDINAL := 0; BEGIN WITH NU = NUMBER(uLab), NV = NUMBER(vLab), NE = NUMBER(e), (* The neighbors of "u" are uAdj[uFirst[u]..uLast[u]] *) (* The corresponding entries in "e" are uEdge[uFirst[u]..uLast[u]] *) (* U vertices with unexplored edges are uStack[0..uTop-1] *) (* Ditto for V *) uFirst = NEW(REF ARRAY OF CARDINAL, NU+1)^, uLast = NEW(REF ARRAY OF CARDINAL, NU+1)^, uAdj = NEW(REF ARRAY OF CARDINAL, NE)^, uEdge = NEW(REF ARRAY OF CARDINAL, NE)^, uStack = NEW(REF ARRAY OF CARDINAL, NU)^, vFirst = NEW(REF ARRAY OF CARDINAL, NV+1)^, uLast = NEW(REF ARRAY OF CARDINAL, NV+1)^, vAdj = NEW(REF ARRAY OF CARDINAL, NE)^, VEdge = NEW(REF ARRAY OF CARDINAL, NE)^, vStack = NEW(REF ARRAY OF CARDINAL, NV)^ DO CollectEdges(e, uFirst, uAdj, vFirst, vAdj); nEdges := NE; WHILE nEdges > 0 DO (* Pick a first edge: *) WITH ie = RC(coins, 0, nEdges) DO u := e[ie].u; v := e[ie].v; RemoveEdge(u, v); uStack[uTop] := u; INC(uTop); vStack[vTop] := v; INV(vTop); WHILE uTop > 0 OR vTop > 0 DO IF (vTop = 0) OR (uTop # 0 AND RB(coins)) THEN DEC(uTop); u := uStack[uTop]; IF uFirst[u] <= uLast[u] THEN v := uAdj[RC(coins, uFirst[u], uLast[u])]; ELSE END END END; END END END DepthLabel; IF ParseParams.KeywordPresent("-order") THEN ot := ParseParams.GetNext(); IF Text.Equal(ot, "Random") THEN o.order := Order.Random ELSIF Text.Equal(ot, "Depth") THEN o.order := Order.Depth ELSIF Text.Equal(ot, "Breadth") THEN o.order := Order.Breadth ELSE Wr.PutText(stderr, "bad order: " * ot & "\n"); RAISE Scan.BadFormat END; ELSE ot := "Random"; o.order := Order.Random END;