@@ -32,16 +32,16 @@ Obj ExecuteDFS(Obj self, Obj args) {
3232 Obj AncestorFunc = ELM_PLIST (args , 6 );
3333 Obj CrossFunc = ELM_PLIST (args , 7 );
3434
35- DIGRAPHS_ASSERT (NARG_FUNC (PreorderFunc ) == 2 );
36- DIGRAPHS_ASSERT (IS_FUNC (AncestorFunc ));
37- DIGRAPHS_ASSERT (NARG_FUNC (AncestorFunc ) == 2 );
38- DIGRAPHS_ASSERT (IS_FUNC (PostOrderFunc ));
39- DIGRAPHS_ASSERT (NARG_FUNC (PostOrderFunc ) == 2 );
40- DIGRAPHS_ASSERT (IS_FUNC (PreorderFunc ));
4135 DIGRAPHS_ASSERT (IS_PREC (record ));
4236 DIGRAPHS_ASSERT (IS_INTOBJ (start ));
37+ // DIGRAPHS_ASSERT(NARG_FUNC(PreorderFunc) == 2);
38+ DIGRAPHS_ASSERT (IS_FUNC (PreorderFunc ));
39+ DIGRAPHS_ASSERT (IS_FUNC (PostOrderFunc ));
40+ // DIGRAPHS_ASSERT(NARG_FUNC(PostOrderFunc) == 2);
41+ DIGRAPHS_ASSERT (IS_FUNC (AncestorFunc ));
42+ // DIGRAPHS_ASSERT(NARG_FUNC(AncestorFunc) == 2);
4343 DIGRAPHS_ASSERT (IS_FUNC (CrossFunc ));
44- DIGRAPHS_ASSERT (NARG_FUNC (CrossFunc ) == 2 );
44+ // DIGRAPHS_ASSERT(NARG_FUNC(CrossFunc) == 2);
4545
4646 Obj D = ElmPRec (record , RNamName ("graph" ));
4747 Int N = DigraphNrVertices (D );
@@ -51,7 +51,7 @@ Obj ExecuteDFS(Obj self, Obj args) {
5151 "the third argument <start> must be a vertex in your graph," , 0L , 0L );
5252 }
5353 Int top = 0 ;
54- Obj stack = NEW_PLIST (T_PLIST_CYC , N );
54+ Obj stack = NEW_PLIST (T_PLIST_CYC , 0 );
5555 AssPlist (stack , ++ top , start );
5656
5757 UInt preorder_num = 0 ;
@@ -62,12 +62,14 @@ Obj ExecuteDFS(Obj self, Obj args) {
6262 Obj parent = ElmPRec (record , RNamName ("parent" ));
6363 Obj postorder = ElmPRec (record , RNamName ("postorder" ));
6464 Obj preorder = ElmPRec (record , RNamName ("preorder" ));
65+ Obj edge = ElmPRec (record , RNamName ("edge" ));
6566
66- DIGRAPHS_ASSERT (LEN_PLIST (parent ) == N );
67- DIGRAPHS_ASSERT (LEN_PLIST (postorder ) == N );
68- DIGRAPHS_ASSERT (LEN_PLIST (preorder ) == N );
67+ DIGRAPHS_ASSERT (LEN_PLIST (parent ) == 1 );
68+ DIGRAPHS_ASSERT (LEN_PLIST (postorder ) == 1 );
69+ DIGRAPHS_ASSERT (LEN_PLIST (preorder ) == 1 );
70+ DIGRAPHS_ASSERT (LEN_PLIST (edge ) == 1 );
6971
70- SET_ELM_PLIST (parent , INT_INTOBJ (start ), start );
72+ AssPlist (parent , INT_INTOBJ (start ), start );
7173
7274 Obj neighbors = FuncOutNeighbours (self , D );
7375 DIGRAPHS_ASSERT (IS_PLIST (neighbors ));
@@ -77,22 +79,27 @@ Obj ExecuteDFS(Obj self, Obj args) {
7779 Int RNamStop = RNamName ("stop" );
7880
7981 while (top > 0 ) {
82+ if (ElmPRec (record , RNamStop ) == True ) {
83+ break ;
84+ }
8085 current = INT_INTOBJ (ELM_PLIST (stack , top -- ));
8186 DIGRAPHS_ASSERT (current != 0 );
8287 if (current < 0 ) {
8388 Int child = -1 * current ;
8489 AssPRec (record , RNamChild , INTOBJ_INT (child ));
8590 AssPRec (record , RNamCurrent , ELM_PLIST (parent , child ));
8691 CALL_2ARGS (PostOrderFunc , record , data );
87- SET_ELM_PLIST (postorder , child , INTOBJ_INT (++ postorder_num ));
92+ AssPlist (postorder , child , INTOBJ_INT (++ postorder_num ));
8893 CHANGED_BAG (record );
8994 continue ;
90- } else if (INT_INTOBJ (ELM_PLIST (preorder , current )) > 0 ) {
95+ } else if (current <= LEN_PLIST (preorder )
96+ && ELM_PLIST (preorder , current ) != 0
97+ && ELM_PLIST (preorder , current ) != Fail ) {
9198 continue ;
9299 } else {
93100 AssPRec (record , RNamCurrent , INTOBJ_INT (current ));
94101 CALL_2ARGS (PreorderFunc , record , data );
95- SET_ELM_PLIST (preorder , current , INTOBJ_INT (++ preorder_num ));
102+ AssPlist (preorder , current , INTOBJ_INT (++ preorder_num ));
96103 CHANGED_BAG (record );
97104 AssPlist (stack , ++ top , INTOBJ_INT (-1 * current ));
98105 }
@@ -105,11 +112,15 @@ Obj ExecuteDFS(Obj self, Obj args) {
105112 for (UInt j = 0 ; j < LEN_LIST (succ ); ++ j ) {
106113 UInt v = INT_INTOBJ (ELM_LIST (succ , LEN_LIST (succ ) - j ));
107114 AssPRec (record , RNamChild , INTOBJ_INT (v ));
108- if (INT_INTOBJ (ELM_PLIST (preorder , v )) == -1 ) {
109- SET_ELM_PLIST (parent , v , INTOBJ_INT (current ));
115+ if (v > LEN_PLIST (preorder ) || ELM_PLIST (preorder , v ) == 0
116+ || ELM_PLIST (preorder , v ) == Fail ) {
117+ AssPlist (parent , v , INTOBJ_INT (current ));
118+ AssPlist (edge , v , INTOBJ_INT (LEN_LIST (succ ) - j ));
110119 CHANGED_BAG (record );
111120 AssPlist (stack , ++ top , INTOBJ_INT (v ));
112- } else if (INT_INTOBJ (ELM_PLIST (postorder , v )) == -1 ) {
121+ } else if (current > LEN_PLIST (preorder )
122+ || ELM_PLIST (preorder , current ) != 0
123+ || ELM_PLIST (preorder , current ) != Fail ) {
113124 CALL_2ARGS (AncestorFunc , record , data );
114125 } else if (INT_INTOBJ (ELM_PLIST (preorder , v ))
115126 < INT_INTOBJ (ELM_PLIST (preorder , current ))) {
0 commit comments