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 AGGA , B ,CA → BB → CA → CUMA, 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.
É 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ó.
fonte
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.
fonte
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.
fonte