그래프 깊이 우선 검색에서 그레이 노드의 목적


19

내가 본 깊이 우선 검색의 많은 구현 (예 : here )에서 코드는 회색 정점 (발견되었지만 모든 이웃이 방문되지는 않음)과 검은 정점 (발견 및 모든 이웃이 방문 됨)을 구분합니다. . 이 구별의 목적은 무엇입니까? DFS 알고리즘은 회색이든 검은 색이든 방문한 정점을 절대 방문하지 않는 것 같습니다.

답변:


26

DFS를 수행 할 때 모든 노드는 방문하기 전, 재귀 적으로 후손을 방문하는 동안 및 모든 후손을 방문한 후 (즉, 랩업 단계) 상위 3 개 상태 중 하나에 있습니다. 세 가지 색상은 세 가지 상태 각각에 해당합니다. 색깔과 방문 시간 및 귀가 시간을 언급하는 이유 중 하나는 더 나은 이해를 위해 이러한 구별을 명시 적으로 작성하는 것입니다.

물론 이러한 색상의 실제 사용이 있습니다. 유 방향 그래프 고려하십시오 . 사이클 이 있는지 G 를 확인한다고 가정하십시오 . 무 방향 그래프에서 고려중인 노드에 검은 색 또는 회색 인접 노드가 있으면주기를 나타냅니다 (그리고 언급 한대로 DFS가 해당 노드를 방문하지 않습니다). 그러나 유향 그래프의 경우 검은 색 이웃은주기를 의미하지 않습니다. - 예를 들어, 세 꼭지점 그래프 고려 , B ,C 와 같은 방향 가장자리 B , B C , C를 . DFS가 A 에서 시작한다고 가정하십시오 .,,그런 다음 를 방문한 다음 C 를 방문하십시오 . 이 반환되면 , 그 다음에 확인하는 것이 C는 이미 방문하고 검은 색으로되어 있습니다. 그러나 그래프에는 사이클이 없습니다.

유 방향 그래프에서 모든 하위 항목을 방문하기 전에 노드가 다시 표시되는 경우에만주기가 존재합니다. 즉, 노드에 회색 인 이웃이 있으면주기가 있습니다 (이웃이 검은 색이 아닌 경우). 회색 노드는 현재 하위 항목을 탐색하고 있음을 의미합니다. 이러한 하위 항목 중 하나가이 회색 노드에 모서리가 있으면주기가있는 것입니다. 따라서 유 방향 그래프에서 사이클을 탐지하려면 3 가지 색상이 필요합니다. 다른 예도있을 수 있지만 아이디어를 얻어야합니다.


2
+1 좋은 설명. 무 방향 그래프에서 모든 노드를 간단하게 순회하려면 (내 질문 본문에 연결된 것과 같이) GRAY와 BLACK에 기능상의 차이가 있습니까?
user6805

1
@ user6805 유향 그래프 또는 무향 그래프 모두의 간단한 순회 (모든 노드 방문)를 위해 회색과 검정색의 기능적 차이는 없습니다. 두 가지 색상 만 사용하거나 방문하거나 방문하지 않을 수 있습니다. 색상이 필요한 더 복잡한 알고리즘을위한 것입니다.
Paresh

이해했습니다! OK, 다음과 같은 경우를 생각해 : twitter.com/MaksimADmitriev/status/796995958043279361는 우리는 DFS를 사용하여 그래프를 통과. 왼쪽의 그래프는이 답변의 그래프와 동일하며주기가 없습니다. 사이클이있는 오른쪽의 그래프를 탐색합시다. A를 방문하여 회색으로 표시합니다. 우리는 B를 방문하여 회색으로 표시합니다. 우리는 C를 방문하여 회색으로 표시합니다. 이제 우리는 이미 회색 인 A를 방문하려고합니다. 따라서 "검정에서 검정으로"는주기가 있다는 것을 의미하는 것이 아니라 "회색에서 회색으로"를 의미합니다. 그래서 우리는 회색이 필요합니다. 내가 틀렸다면 수정하십시오
막심 드미트리

강력하게 연결된 구성 요소를 찾는 것과 같이 훨씬 복잡한 목적을 위해 각 노드에 대해 두 번 기록해야 할 수도 있습니다. 노드를 처음 발견 한 사전 시간 (예 : 회색으로 표시되는 시간) 및 노드 방문이 완료된 후 시간 (즉, 검은 색으로 칠한 시간). 녹음을 구현하기 위해 카운터가 유지되며 각 이벤트가 발생할 때마다 증가합니다.
John

2

CLRS에서는 회색 또는 검은 색을 제거 할 수 있으며 두 가지 색상만으로도 알고리즘이 제대로 작동합니다. 즉, 실제로는 필요하지 않습니다. 꼭짓점을 표시하는 주요 목표는 이미 방문한 꼭짓점을 반복적으로 방문하여 무한 루프에 빠지지 않도록하는 것입니다.

DFS 알고리즘에서 3 가지 색상을 사용하는 이유는 주로 교육적입니다. 개념적으로 더 명확하고, 학생들이 각 노드에서 실행하는 동안 무슨 일이 일어나고 있는지 알 수 있습니다.


0

회색 꼭짓점은 해당 노드를 방문하여 순서대로 이웃 노드 중 하나로 이동했지만 해당 노드에 더 많은 이웃 꼭짓점이있을 수 있음을 나타냅니다. 방문하지 않은 정점을 탐색하기 위해 역 추적하는 동안 유용합니다.

정점 A에 두 개의 이웃 B와 C가 있고 B에 하나의 이웃 D가 있다고 가정 해 봅시다 .

흰색의 정점 A에서 시작하여 회색 으로 만들고 이웃으로 이동합니다.

알파벳 순서를 선택하여 흰색의 버텍스 B방문 하고 회색으로 표시합니다.

그런 다음 흰색-> 회색 D- > 더 이상 이웃의 D를 방문하십시오 . 따라서 D-> black으로 표시 됩니다.

이제 회색으로 B로 되돌아 가고 더 이상 nieghbors가 없습니다. 따라서 B-> black으로 표시 됩니다.

AGain 역 추적 A를 회색으로 표시하고 c-c를 방문하여 c-> 회색으로 더 이상 이웃을 표시하지 않음

마지막으로 A로 돌아가서 정점 A 가 더 이상 흰색 정점이없고 모두 검정으로 표시됩니다.


회색과 검은 색의 차이는 여기에 어떤 목적이 있다면 나는 ..이 표시되지 않습니다
user6805

그것이 당신이 이해해야 할 것입니다. 정점이 검은 색으로 표시되면 해당 정점에 인접한 정점이 없음을 의미합니다. 여기에 정점 D는 이웃 정점이 없기 때문에 검은 색으로 표시됩니다. 회색으로 표시하면 방문 할 이웃이 더 많으므로 해당 횡단을 통과합니다.
NRK

백엔드 에지가없는 것으로 알고있는 노드를 다시 방문하는 것만으로도 절약 할 수 있습니다.
Setheron

0

DFS에서는 에지를 포워드 에지, 백 에지, 크로스 에지 및 트리 에지로 분류합니다.

가장자리를 분류하기 위해 3 가지 색상을 사용합니다. 이 색상은 정점의 상태를 나타냅니다. v. 흰색 : 정점 v가 아직 발견되지 않았습니다.

회색 : v는 이미 발견되었지만 v에서 도달 할 수있는 모든 정점은 아직 발견되지 않았습니다. 따라서 정점 v는 여전히 스택에 있습니다.

검은 색 : v는 이미 스택에서 튀어 나와 있습니다.

가장자리 e를 통과하는 회색 정점을 만나면 DFS를 수행 할 때 뒷면 가장자리입니다. 가장자리 e를 통해 검은 정점을 만나면 교차 가장자리 / 앞으로 가장자리입니다. 흰색 정점이 발생하면 DFS를 재귀 적으로 호출합니다.


그래, 요점이 뭐야? 당신은 흰색 / 회색 / 검정이 앞으로 / 뒤 / 십자가 / 트리와 관련이 있다고 말했지만, 그것들이 무엇을위한 것인지도 말하지 않습니다. 따라서 이제는 3 명 대신 7 명이 이해하지 못하는 것들이 있습니다!
David Richerby

이 에지는 백 에지가 그래프에서 루프를 식별하는 데 사용되는 것처럼, 정방향 및 크로스 에지가 모든 정점 쌍 사이에 고유 한 경로가 있는지 테스트하는 데 사용되는 것처럼 DFS의 다양한 응용에 사용될 수 있습니다.
Neeraj Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.