Olá pessoal, sou o Filipe Névola, este blog foi muito ativo durante 2009 enquanto eu fazia universidade,
hoje em dia estou ativo no Twitter @FilipeNevola e voltando a escrever posts agora no meu perfil do Medium (29/05/2016).

[ 31/08/2009 ] 0

Caminhos em Digrafos

Introdução

Um caminho (= path) num digrafo é uma seqüência de vértices dotada da seguinte propriedade: se v e w são vértices consecutivos na seqüência então v-w é um arco. Em geral, os vértices de um caminho não são todos distintos.

A origem de um caminho é o primeiro vértice do caminho. O término é o último vértice. Diz-se que um caminho com origem s e término t vai de s a t.

Dizemos que um arco v-w pertence a um caminho se o vértice w é o sucessor de v no caminho. Todos os arcos de um caminho apontam no mesmo sentido, de um vértice para o seu sucessor. Há quem goste de enfatizar esse fato dizendo "caminho dirigido" em lugar do nosso "caminho".

O comprimento (= length) de um caminho é o número de termos da seqüência menos um. Em outras palavras, o comprimento de um caminho é o número de arcos do caminho.

Em grafos, a existência de caminhos é uma propriedade simétrica: para quaisquer dois vértices s e t, existe caminho de s a t se e somente se existe caminho de t a s.

Exemplo

Considere, por exemplo, o digrafo definido pelo conjunto de arcos

0-1 0-5 1-0 1-5 2-4 3-1 5-3 .

Eis alguns caminhos nesse digrafo:

3-1-0-1-0-5
3-1-0-5
2-4
1
O primeiro desses caminhos tem comprimento 5 e o último tem comprimento 0. Eis algumas seqüências que não são caminhos:

1-5-0
4-2
2-5

Procurando um caminho num digrafo

Considere o problema de decidir se existe ou não um caminho ligando dois vértices dados num digrafo. A função Path abaixo resolve o problema com uma busca em profundidade.

int G[MAXV][MAXV];
int visitado[MAXV];

//Confere se existe caminho da origem até destino
//retorna true se existe, false caso contrário
bool Path(int origem, int destino){
 memset(visitado,0,sizeof(visitado)); //zerando visitado
 dfs(origem); //faz a busca em profundidade a partir deste vértice
 if(visitado[destino])//se o destino foi visitado
  return true; //tem um caminho que chegou nele
 return false; //não tem um caminho que chega nele
}

Caminhos simples e fechados

Um caminho é simples (= simple path) se não tem vértices repetidos.

Eis alguns caminhos simples no digrafo do exemplo acima:

3-1-0-5
1
2-4
Nesse mesmo digrafo, o caminho 1-0-1-5 não é simples.

Um caminho é fechado (= closed = cyclic path) se tem dois ou mais vértices e o primeiro vértice coincide com o último.

Exercícios para Fixação

1. Faça um algoritmo baseado no Path que pare quando encontrar um caminho entre a origem e o destino.
2. Faça um algoritmo que imprime os vértices visitados na ordem em que os mesmos foram encontrados.
3. Mostre um caminho simples e um fechado para o grafo do exemplo deste link.

Referência: IME

Novo Comentário