O objetivo do nó cinza na pesquisa de profundidade do primeiro gráfico


18

Em muitas implementações da pesquisa de profundidade que eu vi (por exemplo: aqui ), o código distingue entre um vértice cinza (descoberto, mas nem todos os seus vizinhos foram visitados) e um vértice preto (descoberto e todos os seus vizinhos foram visitados) . Qual é o propósito dessa distinção? Parece que o algoritmo DFS nunca visitará um vértice visitado, independentemente de ser cinza ou preto.

Respostas:


25

Ao fazer um DFS, qualquer nó está em um dos três estados - antes de ser visitado, durante a visita recursiva de seus descendentes e depois de todos os seus descendentes terem sido visitados (retornando ao pai, ou seja, fase de finalização). As três cores correspondem a cada um dos três estados. Uma das razões para mencionar cores e horário de visita e retorno é fazer explicitamente essas distinções para melhor compreensão.

Obviamente, existem usos reais dessas cores. Considere um grafo orientado . Suponha que você queira verificar G para a existência de ciclos. Em um gráfico não direcionado, se o nó em consideração tiver um vizinho preto ou cinza, isso indica um ciclo (e o DFS não o visita como você mencionou). No entanto, no caso de um gráfico direcionado , um vizinho preto não significa um ciclo. Por exemplo, considere um gráfico com vértices 3 - A , B , e C , com bordos dirigidos como um B , B C , Um C . Suponha que o DFS inicie em AGGUMA,B,CUMABBCUMACUMA, Em seguida, visitas , então C . Quando retorna a A , verifica se C já foi visitado e está preto. Mas não há ciclo no gráfico.BCUMAC

Em um gráfico direcionado, um ciclo está presente se e somente se um nó for visto novamente antes de todos os seus descendentes terem sido visitados. Em outras palavras, se um nó tiver um vizinho cinza, haverá um ciclo (e não quando o vizinho estiver preto). Um nó cinza significa que atualmente estamos explorando seus descendentes - e se um desses descendentes tiver uma borda para esse nó cinza, haverá um ciclo. Portanto, para detecção de ciclo em gráficos direcionados, você precisa ter 3 cores. Também pode haver outros exemplos, mas você deve entender.


2
+1 boa explicação. Para uma passagem simples de todos os nós em um gráfico não direcionado (como um link no corpo da minha pergunta), GREY e BLACK não têm diferença funcional?
user6805

11
@ user6805 Para um percurso simples - visitando todos os nós - dos gráficos direcionado ou não direcionado, não há diferença funcional entre cinza e preto. Você pode usar apenas duas cores (ou visitadas / não visitadas). É para algoritmos mais complexos que você precisa de cores.
Paresh

Eu entendi isso! OK, considere o seguinte caso: twitter.com/MaksimADmitriev/status/796995958043279361 Atravessamos os gráficos usando o DFS. O gráfico à esquerda é igual ao gráfico desta resposta e não possui ciclos. Vamos percorrer o gráfico à direita, que tem um ciclo. Visitamos A e marcamos em cinza. Visitamos B e o marcamos em cinza. Visitamos C e marcamos cinza. Agora estamos prestes a visitar A, que já está cinza. Então "do preto para o preto" não significa que existe um ciclo, mas "do cinza para o cinza" sim. É por isso que precisamos de cinza. Por favor me corrijam se eu estiver errado
Maksim Dmitriev

Para propósitos ainda mais complexos, como encontrar componentes fortemente conectados, pode ser necessário registrar duas vezes para cada nó: antes da hora em que um nó é encontrado pela primeira vez (ou seja, a hora em que está cinza) e depois da hora em que um nó termina de visitar (ou seja, a hora em que é preto). Para implementar gravações, é mantido um contador, que é aumentado a cada evento.
John John

2

É um exercício no CLRS que você pode remover a cor cinza ou preto e o algoritmo funciona bem com apenas duas cores, ou seja, não é realmente necessário. O principal objetivo de marcar vértices é garantir que não tenhamos um loop infinito visitando repetidamente os vértices já visitados.

O motivo do uso de três cores no algoritmo DFS é principalmente pedagógico: é conceitualmente mais claro, ajuda os alunos a ver o que está acontecendo durante a execução de cada nó.


0

O vértice cinza indica que você visitou esse nó e mudou para um de seus vizinhos em alguma ordem, mas pode haver mais vértices vizinhos nesse nó. Embora seja útil ao voltar atrás para explorar vértices não visitados.

Digamos Vertex A tem dois vizinhos B e C e B tem um vizinho D .

comece no vértice A, que é de cor branca, torne-o cinza e atravesse para o vizinho.

Digamos que, escolhendo a ordem alfabética, ele visite o vértice B, que é na cor branca e marca como cinza.

Então visita D de branco -> cinza D -> sem mais vizinhos. daqui marca D-> preto .

Agora, volte para B em Gray e não mais nieghbors. Daí as marcas B-> preto .

Mais uma vez, retrocede A em cinza e visita a marca c em c-> Cinza, não há mais vizinhos que marcam C como preto

finalmente, volte para A e marque o vértice A como preto, pois não há mais vértices brancos e todos como pretos.


Eu não ver se a distinção entre cinza e preto tem qualquer finalidade aqui ..
user6805

é isso que você precisa entender. Se um vértice estiver marcado como preto, significa que não haveria vértices vizinhos a esse vértice. Aqui o vértice D é marcado como preto, pois não há vértices vizinhos. Onde, como o cinza sugere, há mais vizinhos para visitar e, portanto, você os atravessa.
NRK

Eu acredito que ele evita que você simplesmente re-visitar nós que sabemos com certeza não têm bordas de volta (ou seja optimization)
Setheron

0

No DFS, classificamos as arestas como borda dianteira, borda traseira, borda transversal e borda de árvore.

Usamos 3 cores para classificar as bordas. e essas cores representam o estado do vértice, ou seja, v. branco: o vértice v ainda não foi descoberto.

grey: v já foi descoberto, mas todos os vértices acessíveis de v ainda não foram descobertos. então o vértice v ainda está na pilha.

black: v já está fora da pilha.descoberto e finalizado.

Ao fazer o DFS, se você encontrar um vértice cinza na aresta e, então, é uma aresta traseira. Se você encontrar um vértice preto na aresta e, então, é uma aresta cruzada / aresta dianteira. se você encontrar vértice branco, chamará o DFS recursivamente.


OK, mas qual é o objetivo? Você disse que branco / cinza / preto está relacionado a avançar / voltar / cruzar / árvore, mas também não diz para que servem essas coisas. Então agora existem sete coisas que o solicitante não entende, em vez de apenas três!
David Richerby

Essas arestas podem ser usadas em várias aplicações do DFS, como as arestas traseiras são usadas na identificação de loops em um gráfico, as arestas direta e transversal são usadas para testar se existe um caminho único entre cada par de vértices.
Neeraj Singh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.