16 #define UNVISITED (-2)
17 #define UNASSIGNED (-1)
98 Int nblocks = *p_nblocks ;
99 Int timestamp = *p_timestamp ;
126 Cstack [++chead] = j ;
128 Time [j] = timestamp ;
129 Low [j] = timestamp ;
136 Pstack [jhead] = Ap [jj] ;
143 for (p = Pstack [jhead] ; p < pend ; p++)
151 Pstack [jhead] = p + 1 ;
154 Jstack [++jhead] = i ;
168 Low [j] =
MIN (Low [j], Time [i]) ;
184 if (Low [j] == Time [j])
190 i = Cstack [chead--] ;
201 parent = Jstack [jhead] ;
202 Low [parent] =
MIN (Low [parent], Low [j]) ;
211 *p_timestamp = timestamp ;
212 *p_nblocks = nblocks ;
240 chead, timestamp, nblocks,
n, *Ap, *Ai, *Flag, *Cstack, *Time, *Low,
258 Cstack [++chead] = j ;
260 Time [j] = timestamp ;
261 Low [j] = timestamp ;
270 for (p = Ap [jj] ; p < Ap [jj+1] ; p++)
284 Low [j] =
MIN (Low [j], Time [i]) ;
293 if (Low [j] == Time [j])
298 i = Cstack [chead--] ;
311 Low [parent] =
MIN (Low [parent], Low [j]) ;
366 Int timestamp, nblocks, *Flag, *Cstack, *Time, *Low, *Jstack, *Pstack ;
404 Time = Work ; Work += n ;
405 Flag = Work ; Work += n ;
411 Jstack = Work ; Work += n ;
415 for (j = 0 ; j < n ; j++)
436 for (j = 0 ; j < n ; j++)
439 ASSERT (Flag [j] ==
UNVISITED || (Flag [j] >= 0 && Flag [j] < nblocks));
444 amesos_dfs (j, Ap, Ai, Q, Time, Flag, Low, &nblocks, ×tamp,
445 Cstack, Jstack, Pstack) ;
460 for (b = 0 ; b < nblocks ; b++)
464 for (j = 0 ; j < n ; j++)
467 ASSERT (Time [j] > 0 && Time [j] <= n) ;
468 ASSERT (Low [j] > 0 && Low [j] <= n) ;
469 ASSERT (Flag [j] >= 0 && Flag [j] < nblocks) ;
475 for (b = 1 ; b < nblocks ; b++)
477 Time [b] = Time [b-1] + R [b-1] ;
479 for (b = 0 ; b < nblocks ; b++)
490 for (k = 0 ; k < n ; k++)
496 for (j = 0 ; j < n ; j++)
499 P [Time [Flag [j]]++] = j ;
503 for (k = 0 ; k < n ; k++)
527 for (k = 0 ; k < n ; k++)
529 Time [k] = Q [P [k]] ;
531 for (k = 0 ; k < n ; k++)
static void amesos_dfs(Int j, Int Ap[], Int Ai[], Int Q[], Int Time[], Int Flag[], Int Low[], Int *p_nblocks, Int *p_timestamp, Int Cstack[], Int Jstack[], Int Pstack[])
#define ASSERT(expression)