UNIVERSIDADE FEDERAL DE JUIZ DE FORA INSTITUTO DE CIÊNCIAS EXATAS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO Enumeração de Caminhos
UNIVERSIDADE FEDERAL DE JUIZ DE FORA INSTITUTO DE CIÊNCIAS EXATAS
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO
Enumeração de Caminhos
Thiago Baêsso ProcaciCláudio Lopes
Agenda
• Algoritmo de rotulação de nós
• Algoritmo de rotulação de arcos
• Números de caminhos através de qualquer nó ou arco
• Detalhes de implementação
• Complexidade
Objetivo
• Estudar algoritmos que nos permita obter o números de caminhos, em uma rede acíclica e direcionada, de um nó origem a um nó destino
Algoritmo de Rotulação de Nós
Rotulação de Nós - Definições
O que significa o rótulo de um nó?Considere: s nó origem; t nó destino
O rótulo de cada nó denota o número possíveis de
caminhos para alcançar o nó destino
1
2
3
Rotulação de Nós - Definições
• Scanned: nó já analisado
• UnScannable: nó não analisado
• NScannable: nó cujo que não tem sucessores imediatos ou todos os seus sucessores já foram analisados (scanned).
Com essas definições já é possível entender o algoritmo
Rotulação de Nós - Passos
• Passo 1: Rotular todos os nós NScannable com 0 (zero). Rotular o nó destino com 1.
• Passo 2 (Geral): Analise todos o NScannable k nós e rotule todos os seus J nós antecessores imediatos com:Rótulo J = Rótulo J + Rótulo K
Rotulação de Nós - Passos
• Passo 3: Se o nó origem se tornar NScannable, pare. O número de caminhos possíveis entre a origem e o destino é o rótulo do nó origem.
• Obs.: Se em algum momento todos os nós forem unScannable, pare (não existe nenhum nó que possa ser analisado). Isso implica a existência de ciclos.
Rotulação de Nós - Exemplo
Inicialização: Identificar quais nós são nScannable (não tem sucessores
imediatos) e rotulá-los com 0. Rotular o destino com 1.
1
O nó t é NScannable
NScannable
s: origem
t: destino
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
1 NScannable
Antecessores de t: 1 e 2 Rótulo 1 = Rótulo 1 + Rótulo t Rótulo 2 = Rótulo 2 + Rótulo t
1
1
O nó t ficará scanned
Rotulação de Nós - Exemplo
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
scanned
NScannable identificado: 1.Seu sucessor (t) é scanned.
NScannable1
1
1
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
scanned
NScannable1
1
1
Antecessores de 1: s e 2 Rótulo s = Rótulo s + Rótulo 1 Rótulo 2 = Rótulo 2 + Rótulo 1+ 1 = 2
1
O nó 1 ficará scanned
scanned
1
1
Rotulação de Nós - Exemplo
scanned
2
1
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
NScannable identificado: 2.Seus sucessores (t,1) são scanned.
NScannable
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
scanned
1
1
scanned
2
1
NScannable
Antecessor de 2: s Rótulo s = Rótulo s + Rótulo 2
+ 2 = 3
O nó 2 ficará scanned
Rotulação de Nós - Exemplo
scanned
1
1 scanned
2 scanned
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
NScannable identificado: s.Seus sucessores (1,s) são
scanned.
3
NScannable
Critério de parada satisfeito. O número de caminhos de s até t é 3
Algoritmo de Rotulação de Arcos
Rotulação de Arcos - Definições
O que significa o rótulo de um arco?Considere: s nó origem; t nó destino
O rótulo de cada arco denota o número possíveis
de caminhos, através do arco, da origem para o nó
onde o arco incide
1
1
1
2
1
• LScannable: nó que não tem nenhum arco que chega ou todos os arcos que chegam estão rotulados
Com essas definições já é possível entender o algoritmo
Rotulação de Arcos - Definições
Rotulação de Arcos - Passos
• Passo 1: Rotular todos os arcos que saem dos nós LScannable com 0 (zero). Rotular todos os arcos que saem da origem com 1
• Passo 2 (Geral): Analise todos o LScannable k nós e rotule todos os seus arcos de saída com a soma de todos os rótulos dos arcos que chegam em k
Rotulação de Arcos - Passos
• Passo 3: Se o nó destino se tornar LScannable, pare. O número de caminhos possíveis entre a origem e o destino é o a soma dos rótulos dos arcos incidentes no nó destino .
• Obs.: Se em algum momento todos os nós forem unScannable, pare (não existe nenhum nó LScannable). Isso implica a existência de ciclos.
Rotulação de Arcos - Exemplo
s: origem
t: destino
Inicialização: Identificar quais nós são LScannable (não tem arco que chega) e
rotular seus arcos de saída com 0. Rotular os arcos que saem da origem
com 1.
LScannable identificado: 1.Não tem arco que chega nele.
Rotular seus arcos de saída com 0
LScannable
0
0
Nó origem: sRotular os arcos que saem de s
com 1
1
11
Sempre que todos os arcos que saem de um nó são rotulados, o nó
passa a ser scanned (1 e s)
Rotulação de Arcos - Exemplo
Passo Geral: Identificar nós que são LScannable
0
0
1
11
scanned
scannedLScannable identificado: 2.
Todos os arcos que chegam nele estão rotulados
LScannable
Rotulação de Arcos - Exemplo
0
0
1
11
scanned
LScannable
Passo Geral: Analisar todos os nós LScannable e rotular seus arcos de saída
com a soma dos rótulos dos arcos que chegam no nó.
Rotular o arco que sai de 2.Rótulo do arco que sai = soma dos
rótulos dos arcos que chegam
0 + 1 = 1
O nó 2 se torna scanned
scanned
Rotulação de Arcos - Exemplo
0
0
1
11
scanned
scanned
scanned1
Passo Geral: Identificar nós que são LScannable
LScannable identificado: 3.Todos os arcos que chegam nele
estão rotulados
LScannable
Rotulação de Arcos - Exemplo
scanned
scanned
scanned LScannable
0
0
1
11
1
Passo Geral: Analisar todos os nós LScannable e rotular seus arcos de saída
com a soma dos rótulos dos arcos que chegam no nó.
Rotular o arco que sai de 3.Rotulo do arco que sai = soma dos
rótulos dos arcos que chegam
1 + 1 = 2
O nó 3 se torna scanned
Rotulação de Arcos - Exemplo
Passo Geral: Identificar nós que são LScannable
LScannable identificado: t.Todos os arcos que chegam nele
estão rotulados
scanned
scanned
scanned
0
0
1
11
1scanned
2 Fim do algoritmo, pois o nó destino se tornou
LScannable. O número de caminhos de s para t é a
soma dos rótulos dos arcos que incide em t.
1 + 2 = 3
LScannable
Números de caminhos através de qualquer nó
Aplicando o algoritmo de rotulação de nós obtemos os rótulos (n’k) de cada nó. O rótulo de um nó indica o número de caminhos distintos de um nó k até o nó destino.
Se invertermos as direções de todos os arcos da rede e aplicar o algoritmo de rotulação de nós obteremos os rótulos (n’’k) de cada nó. Neste caso o rótulo indica o número de caminhos distintos de um nó k até o destino, que era a origem no grafo original
O número total de caminhos da origem ao destino através de um nó k é:
nk = n’k x n’’k
Exemplo
3
1
2
11
1
2
3Inverte
Multiplica-se os rótulos
3
2
2
3
Tem-se o números de caminhos distintos de s a t através do nó 1
Números de caminhos através de qualquer arco
O mesmo é válido para rotulação de arcos.
2. Aplica-se o algoritmo de rotulação de arcos para um rede.
3. Inverte os arcos da rede
4. Aplica o algoritmo de rotulação para a rede invertida
5. Multiplica-se os rótulos dos arcos
Como resultado temos o número de caminhos distintos da origem ao destino através de um arco
Detalhes de implementação - Modelo
Detalhes de implementação
Detalhes de implementação
Detalhes de implementação
ComplexidadeOrdem de O(n³) – Rotulação de nós
ComplexidadeOrdem de O(n³) – Rotulação de
arcos
Fim Fonte: Simple Paths in a Directed
Network by Pitu Mirchandani