- // We keep all the vertices with incoming nodes
- for(int f = 0; f < pred_nb_unreached; f++) {
- v = unreached[f];
- if(v->distance_from_source == rank) {
- unreached[nb_unreached++] = v;
+ scalar_t rank = 1;
+ while(nb_without_predecessor > 0) {
+ new_nb_without_predecessor = 0;
+ for(int l = 0; l < nb_without_predecessor; l++) {
+ v = _vertices + without_predecessor[l];
+ v->distance_from_source = rank;
+ for(e = v->leaving_edge_list_root; e; e = e->next_leaving_edge) {
+ tv = int(e->terminal_vertex - _vertices);
+ nb_predecessors[tv]--;
+ ASSERT(nb_predecessors[tv] >= 0);
+ if(nb_predecessors[tv] == 0) {
+ new_without_predecessor[new_nb_without_predecessor++] = tv;
+ }