비가 중 그래프에서 DFS를 사용하여 최단 경로를 찾을 수없는 이유는 무엇입니까?


16

DFS를 "있는 그대로"사용하면 비가 중 그래프에서 최단 경로를 찾지 못할 것입니다.

그러나 왜 DFS를 조정하여 비가 중 그래프에서 최단 경로를 찾을 수 있도록 하는가? 주제에 관한 모든 텍스트는 단순히 할 수 없다고 명시합니다. 나는 자신을 시도하지 않고 확신하지 못한다.

DFS가 비가 중 그래프에서 최단 경로를 찾을 수있는 수정 사항을 알고 있습니까? 그렇지 않은 경우 알고리즘을 어렵게 만드는 알고리즘은 무엇입니까?


1
비가 중 그래프에서 가장 일반적인 경로 찾기 알고리즘은 A *이며, 타이가 마무리에 가까워 지도록 약간 수정되었습니다. 이렇게하면 DFS와 유사한 알고리즘이 제공되는데, 가장 직접적인 경로를 먼저 시도하고 필요한 경우 바깥쪽으로 만 버블 링합니다.
BlueRaja-대니 Pflughoeft

1
일부 (잘 선택된) 그래프에서 DFS를 사용해보십시오. 실제로 작동하지 않으면 문제가 발생해야합니다. Btw, 귀하의 질문은 가중 그래프에서 작동하는 것처럼 읽습니다.
Raphael

답변:


12

깊이 우선 검색의 유일한 요소는 아동을 조사하는 순서입니다. 일반 버전은 임의의 순서, 즉 자식이 저장된 순서대로 진행됩니다.

내가 할 수있는 유일한 대안 (가장 짧은 길을 향한)은 탐욕스러운 접근 방식이며, 현재 노드에서 작은 노드에서 큰 노드까지의 거리 순서대로 어린이를보고 있습니다. 이 규칙에 대한 반례를 구성하는 것은 쉽습니다.

욕심 많은 규칙에 대한 반대 예
[ 출처 ]

이제 DFS가 가장 짧은 경로를 찾을 수 있도록 조사 할 다음 자녀를 선택하는 전략이 없다는 증거는 아닙니다.

(s,t)(s,a)a(a,b)(s,t)

cc1


  1. 규칙이 결정적인 한. 그렇지 않은 경우 항상 최단 경로를 찾을 수있는 것은 아닙니다 .

내가 틀렸다면 수정하지만 DFS가 그래프에서 최단 경로를 찾을 수 있지만 그렇게하는 동안 지수 시간이 걸리는 것을 의미합니까?
Anmol Singh Jaggi 2012

@AnmolSinghJaggi No. DFS는 단 하나의 경로 만 찾습니다.
Raphael

10

너비 우선 탐색은 비가 중 그래프에서 최단 경로를 찾는 알고리즘입니다.

DFS에서 비가 중 그래프에서 가장 짧은 경로를 찾는 알고리즘으로 변경하는 간단한 조정이 있습니다. 기본적으로 DFS에서 사용하는 스택을 대기열로 바꿉니다. 그러나 결과 알고리즘을 더 이상 DFS라고하지 않습니다. 대신에 폭 넓은 검색을 구현했을 것입니다.

위의 단락은 올바른 직관을 제공하지만 상황을 약간 단순화합니다. 간단한 스왑으로 광범위한 첫 검색을 구현하는 코드를 작성하는 것은 쉽지만 처음에는 올바른 구현처럼 보이지만 실제로는 그렇지 않은 코드를 작성하는 것도 쉽습니다. BFS와 DFS 에 대한 관련 cs.SE 질문은 여기 에서 찾을 수 있습니다 . 당신은 몇 가지 찾을 수 있습니다 여기에 좋은 의사 코드를.


3

당신은 할 수 있습니다 !!!

깊이가는 동안 노드를 방문한 것으로 표시하고 돌아 오는 동안 표시를 해제하고 다른 분기가 반복되는 것을 발견하면 돌아옵니다.

대상 노드를 찾은 모든 가능한 검색에 대해 비용 / 경로를 저장하고 그러한 모든 비용 / 경로를 비교 한 후 가장 짧은 경로를 선택하십시오.

이 접근법의 큰 (그리고 큰 의미) 문제는 동일한 노드를 여러 번 방문하여 dfs를 최단 경로 알고리즘에 대한 명백한 나쁜 선택으로 만듭니다.


1
st

1
@ user2407394 실제로 이러한 DFS 변형을 한 번 구현하고 적당히 큰 그래프에 대해 올바르게 실행 했습니까? 이 변형을 DFS라고 부르는 것이 주저합니다. 나는 그것을 깊이 우선 경로 소진 검색이라고 부릅니다.
John L.

나는 이런 종류의 접근 방식을 구현했는데 그 동작은 정말 느리다. 성능 향상을 위해 mnemonization을 추가 할 생각입니다.
Mic

@ user2407394 그것은 효과가있는 것처럼 보이지만 모두 표시하지 않으면 '방문한'목록이 없기 때문에 중지해야 할 시점을 어떻게 확인합니까?
Joe Black

0

BFS는 루트에서 모든 가장자리를 확인하고 루트에서 다른 노드까지의 거리를 가능한 한 최소한으로 유지하는 멋진 속성을 가지고 있지만 dfs는 단순히 첫 번째 인접 노드로 점프하여 깊이있게 이동합니다. 최단 경로를 얻기 위해 DFS를 수정할 수는 있지만 시간이 더 복잡한 알고리즘으로 끝나거나 BFS와 동일한 작업을 수행하게됩니다.


-3

IT는 DFS를 사용하여 모서리 수가 최소 인 두 정점 사이의 경로를 찾을 수 있습니다. 우리는 레벨 접근을 적용 할 수 있습니다


2
자세한 내용을 알려주십시오. 이 단일 문장에서 어떤 알고리즘을 설명하려고하는지 말할 수 없습니다.
David Richerby

-3

당신은 할 수 있습니다

dfs 방식으로 그래프를 탐색하고 확인하십시오.

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

전체 솔루션에 대한 링크는 다음과 같습니다.


1
수락 된 답변은 이것이 불가능하다고 주장하며 이는 귀하의 주장과 모순됩니다. 그럼에도 불구하고이 접근법이 효과가 있다고 생각하는 이유를 설명 할 수 있습니까? (또는이 접근법이 일반적인 이유를 설명하십시오)
이산 도마뱀

가없는이 단지 반복 user2407394의 답변을 전용으로, 어려운 이해 (당신은 무엇 정의되지 않은 한 코드를 어떤 이들 변수의 의미, 그리고 나에게, 아니 분명) 대신에 대한 설명?
David Richerby 2016 년

예, user2407394 님의 답변입니다. 불편을 드려 죄송합니다. 코드에 주석을 추가했습니다. 지금 확인할 수 있습니다.
Anmol Middha 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.