19 #define UNVISITED (-2)
20 #define UNASSIGNED (-1)
101 Int nblocks = *p_nblocks ;
102 Int timestamp = *p_timestamp ;
129 Cstack [++chead] = j ;
131 Time [j] = timestamp ;
132 Low [j] = timestamp ;
139 Pstack [jhead] = Ap [jj] ;
146 for (p = Pstack [jhead] ; p < pend ; p++)
154 Pstack [jhead] = p + 1 ;
157 Jstack [++jhead] = i ;
171 Low [j] =
MIN (Low [j], Time [i]) ;
187 if (Low [j] == Time [j])
193 i = Cstack [chead--] ;
204 parent = Jstack [jhead] ;
205 Low [parent] =
MIN (Low [parent], Low [j]) ;
214 *p_timestamp = timestamp ;
215 *p_nblocks = nblocks ;
243 chead, timestamp, nblocks,
n, *Ap, *Ai, *Flag, *Cstack, *Time, *Low,
261 Cstack [++chead] = j ;
263 Time [j] = timestamp ;
264 Low [j] = timestamp ;
273 for (p = Ap [jj] ; p < Ap [jj+1] ; p++)
287 Low [j] =
MIN (Low [j], Time [i]) ;
296 if (Low [j] == Time [j])
301 i = Cstack [chead--] ;
314 Low [parent] =
MIN (Low [parent], Low [j]) ;
369 Int timestamp, nblocks, *Flag, *Cstack, *Time, *Low, *Jstack, *Pstack ;
407 Time = Work ; Work += n ;
408 Flag = Work ; Work += n ;
414 Jstack = Work ; Work += n ;
418 for (j = 0 ; j < n ; j++)
439 for (j = 0 ; j < n ; j++)
442 ASSERT (Flag [j] ==
UNVISITED || (Flag [j] >= 0 && Flag [j] < nblocks));
447 amesos_dfs (j, Ap, Ai, Q, Time, Flag, Low, &nblocks, ×tamp,
448 Cstack, Jstack, Pstack) ;
463 for (b = 0 ; b < nblocks ; b++)
467 for (j = 0 ; j < n ; j++)
470 ASSERT (Time [j] > 0 && Time [j] <= n) ;
471 ASSERT (Low [j] > 0 && Low [j] <= n) ;
472 ASSERT (Flag [j] >= 0 && Flag [j] < nblocks) ;
478 for (b = 1 ; b < nblocks ; b++)
480 Time [b] = Time [b-1] + R [b-1] ;
482 for (b = 0 ; b < nblocks ; b++)
493 for (k = 0 ; k < n ; k++)
499 for (j = 0 ; j < n ; j++)
502 P [Time [Flag [j]]++] = j ;
506 for (k = 0 ; k < n ; k++)
530 for (k = 0 ; k < n ; k++)
532 Time [k] = Q [P [k]] ;
534 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)