@@ -372,7 +372,7 @@ void visit(grafo g, vertice u, vertice* stack, int* topo_stack)
372
372
}
373
373
374
374
// prepend u to L
375
- stack [(* topo_stack )++ ] = u ; // TODO: talvez precise checar se nao vai estourar?
375
+ stack [(* topo_stack )++ ] = u ;
376
376
}
377
377
}
378
378
@@ -381,21 +381,29 @@ void assign(grafo g, vertice u, vertice root, grafo subgrafo)
381
381
info_vertice * info_root ;
382
382
info_root = (info_vertice * ) aggetrec (root , "info_vertice" , TRUE);
383
383
384
+
384
385
// For each in-neighbour v of u, do Assign(v,root)
385
386
for (Agedge_t * e = agfstin (g , u ); e ; e = agnxtin (g , e )) // esse agnxtout funciona?
386
387
{
387
- info_vertice * info = (info_vertice * ) aggetrec (e -> node , "info_vertice" , TRUE);
388
+ info_vertice * info_prox = (info_vertice * ) aggetrec (e -> node , "info_vertice" , TRUE);
389
+
390
+ if (info_prox -> componente == 0 ) {
391
+ // não definiu o componente ainda
388
392
389
- if (info -> componente == 0 ) {
390
393
// adiciona ao componente do root.
391
- info -> componente = info_root -> componente ;
394
+ info_prox -> componente = info_root -> componente ;
392
395
393
- // adiciona ao subgrafo
396
+ // adiciona arestas e seus vértices ao subgrafo do componente
394
397
agsubedge (subgrafo , e , TRUE);
395
398
396
399
// faz o mesmo pros vizinhos
397
400
assign (g , e -> node , root , subgrafo );
398
401
}
402
+
403
+ if (info_prox -> componente == info_root -> componente ) {
404
+ // adiciona a aresta ao subgrafo/componente
405
+ agsubedge (subgrafo , e , TRUE);
406
+ }
399
407
}
400
408
401
409
}
@@ -422,7 +430,7 @@ grafo decompoe(grafo g)
422
430
visit (g , u , stack , & topo_stack );
423
431
}
424
432
425
- int id_subgrafo = 0 ; // TODO: teoricamente teria que ser um id unico, talvez de so pra usar uma string nao sei.
433
+ int id_componente = 0 ;
426
434
427
435
// para cada u em L, em ordem
428
436
while (topo_stack != 0 ) {
@@ -431,8 +439,15 @@ grafo decompoe(grafo g)
431
439
info_vertice * info = (info_vertice * ) aggetrec (u , "info_vertice" , TRUE);
432
440
433
441
if (info -> componente == 0 ) {
434
- // Cria um subgrafo de g com ID único
435
- grafo s = agidsubg (g , id_subgrafo ++ , TRUE);
442
+ // Cria um subgrafo de g para servir de componente.
443
+ grafo s = agsubg (g , NULL , TRUE);
444
+
445
+ // adiciona u a seu próprio componente
446
+ agsubnode (s , u , TRUE);
447
+
448
+ // seta um novo id para o componente
449
+ info -> componente = ++ id_componente ;
450
+
436
451
assign (g , u , u , s );
437
452
}
438
453
0 commit comments