Você está na página 1de 3

Os pseudocodigos abaixo nao estao da maneira que eu gostaria, com uma parte que eu nao entendi

"process vertex v" e "process component", o que isso deveria fazer na pratica, processar como
assim?

Abaixo implementamos o algoritmo DFS, precisaremos de dois, uma implementação comum que varre os
vértices de G, e outra que guarda numa pilha os vértices visitados começando pelo primeiro
vértice, que terá a menor prioridade:

```
DFS(G, v, visited)
visited[v] = true
process vertex v
for each u in G.adjacentEdges(v) do
if visited[u] == false then
DFS(G, u, visited)
```

A próxima, chamada de PDFS, que receberá G e uma pilha com os vértices de G como parâmetro e será
chamada inicialmente:

```
PDFS(G, v, priority, visited)
visited[v] = true
for each u in G.adjacentEdges(v) do
if visited[u] == false then
PDFS(G, u, priority, visited)
priority.push(v)
```

Precisamos também da lógica para gerar o grafo G transverso (TG), o qual chamaremos de TRANSFORM e
usaremos o retorno para chamar DFS:

```
TRANSFORM(G)
TG = new Graph()
for each v in G.vertices do
for each u in G.adjacentEdges(v) do
TG.addEdge(u, v)
return TG
```

E por fim temos o que é preciso para construir o pseudocódigo do Algoritmo de Kosaraju:

```
KOSARAJU(G)
priority = new Stack()
visited = new Array( false, ..., false ) // array of size |V| filled with false
for each v in G.vertices do
if visited[v] == false then
PDFS(G, v, priority, visited)
TG = TRANSFORM(G)
visited = new Array( false, ..., false )
while priority is not empty do
v = priority.pop()
if visited[v] == false then
DFS(TG, v, visited)
process component
```

Onde iniciamos uma Pilha de Vértices priority e um Array de vértices visited, então visitaremos
cada vértice de G com PDFS(G, v, priority, visited) para cada vértice v que que atualizará
prioridade; depois iniciamos TG que guardará o grafo transposto de G através de TRANSFORM(G);
então, após limpar o array para a próxima Busca em Profundidade, varreremos cada vértice da pilha
na ordem correta através de priority.pop() até que priority esteja vazia, processando cada SCC.
Então, dessa forma, cada conjunto de Componentes Fortemente Conectado são encontrados.

Claro, o algoritmo de Kosaraju é usado para encontrar componentes fortemente conectados em um


grafo direcionado. Vamos esmiuçar alguns pontos-chave no seu pseudocódigo:
1. **DFS (Depth-First Search):**
- O "process vertex v" refere-se a qualquer ação que você deseja realizar em um vértice quando
ele é visitado durante a busca em profundidade. Isso pode ser qualquer operação que você queira
executar com o vértice, como imprimi-lo, armazená-lo em uma lista, calcular algo com ele, etc. É
uma ação genérica, específica do problema que você está resolvendo.

2. **PDFS (Priority-First Depth-First Search):**


- O `priority.push(v)` em `PDFS` serve para adicionar o vértice à pilha de prioridades. Isso
ajuda a garantir que os vértices sejam processados em uma ordem específica, que é o inverso da
ordem em que foram finalizados durante a busca em profundidade.

3. **TRANSFORM:**
- Este procedimento cria o grafo transposto. Para cada aresta (u, v) em G, a função adiciona
uma aresta correspondente (v, u) no grafo transposto. Basicamente, inverte as direções das arestas
do grafo original.

4. **Algoritmo de Kosaraju:**
- Começa visitando cada vértice do grafo original `G` usando `PDFS` para preencher a pilha
`priority` com os vértices na ordem correta de finalização da DFS. Então, cria o grafo transposto
`TG` usando `TRANSFORM(G)`.
- Em seguida, executa um DFS em `TG` a partir dos vértices na pilha de prioridades. Isso
encontra os componentes fortemente conectados do grafo `G`. O "process component" refere-se a como
você deseja lidar com cada componente fortemente conectado encontrado. Pode ser impressão,
armazenamento, cálculos adicionais, entre outros.

Em resumo, o algoritmo de Kosaraju funciona usando duas passagens do algoritmo de busca em


profundidade (DFS) nos grafos original e transposto para encontrar os componentes fortemente
conectados no grafo direcionado. As ações "process vertex" e "process component" são genéricas e
dependem do que você deseja fazer com os vértices e os componentes fortemente conectados
encontrados durante a execução do algoritmo.

Se sao generica como faria pra obter um output dos componentes de um grafo G?

Para obter um output dos componentes de um grafo \( G \) utilizando o algoritmo de Kosaraju, você
pode ajustar a função "process component" para armazenar ou imprimir os componentes fortemente
conectados encontrados.

Se estiver buscando armazenar os componentes fortemente conectados, pode usar uma estrutura de
dados, como uma lista de listas (no caso de linguagens que suportam listas aninhadas) ou um
dicionário onde a chave seja o identificador do componente e o valor seja uma lista de vértices
pertencentes a esse componente.

Se preferir imprimir os componentes, pode fazer isso durante a execução do algoritmo. Por exemplo,
assim que um componente for encontrado, você pode imprimir ou registrar essa informação.

Para ajustar o pseudocódigo do algoritmo de Kosaraju a fim de armazenar os componentes:

1. **Antes de iniciar o algoritmo:**

Crie uma estrutura de dados para armazenar os componentes. Por exemplo, em pseudocódigo:

```plaintext
componentes = ListaVazia()
```

2. **Na parte "process component" do algoritmo de Kosaraju:**

Modifique a lógica para armazenar os componentes fortemente conectados encontrados. Por


exemplo:

```plaintext
process component
componente_atual = ListaVazia()
while a pilha de visitados não estiver vazia:
v = visitados.pop()
Adicione v ao componente_atual
Adicione componente_atual à lista de componentes
```
Ao final da execução do algoritmo de Kosaraju, a variável `componentes` conterá todos os
componentes fortemente conectados encontrados no grafo \( G \). Cada elemento da lista
representará um componente, e os vértices que compõem o componente estarão listados dentro desse
elemento.

Você também pode gostar