Skip to content

Commit 4277474

Browse files
committed
a principio funfando
1 parent 3b4d8b6 commit 4277474

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

Diff for: grafo.c

+23-8
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void visit(grafo g, vertice u, vertice* stack, int* topo_stack)
372372
}
373373

374374
// prepend u to L
375-
stack[(*topo_stack)++] = u; // TODO: talvez precise checar se nao vai estourar?
375+
stack[(*topo_stack)++] = u;
376376
}
377377
}
378378

@@ -381,21 +381,29 @@ void assign(grafo g, vertice u, vertice root, grafo subgrafo)
381381
info_vertice *info_root;
382382
info_root = (info_vertice *) aggetrec(root, "info_vertice", TRUE);
383383

384+
384385
// For each in-neighbour v of u, do Assign(v,root)
385386
for (Agedge_t *e = agfstin(g, u); e; e = agnxtin(g, e)) // esse agnxtout funciona?
386387
{
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
388392

389-
if (info->componente == 0) {
390393
// adiciona ao componente do root.
391-
info->componente = info_root->componente;
394+
info_prox->componente = info_root->componente;
392395

393-
// adiciona ao subgrafo
396+
// adiciona arestas e seus vértices ao subgrafo do componente
394397
agsubedge(subgrafo, e, TRUE);
395398

396399
// faz o mesmo pros vizinhos
397400
assign(g, e->node, root, subgrafo);
398401
}
402+
403+
if (info_prox->componente == info_root->componente) {
404+
// adiciona a aresta ao subgrafo/componente
405+
agsubedge(subgrafo, e, TRUE);
406+
}
399407
}
400408

401409
}
@@ -422,7 +430,7 @@ grafo decompoe(grafo g)
422430
visit(g, u, stack, &topo_stack);
423431
}
424432

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;
426434

427435
// para cada u em L, em ordem
428436
while (topo_stack != 0) {
@@ -431,8 +439,15 @@ grafo decompoe(grafo g)
431439
info_vertice *info = (info_vertice *) aggetrec(u, "info_vertice", TRUE);
432440

433441
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+
436451
assign(g, u, u, s);
437452
}
438453

0 commit comments

Comments
 (0)