2016-07-04 7 views
5

Google에 계속 노력하고 있지만 결과는 내가 혼란에 빠지기 만하는 것입니다. 그것은 아마도 둘 다 사용할 수있을 것 같습니다? 그렇다면 기본적으로 어떤 용도로 설계되었으며 기본 지향적이지 않은 방식으로 작동하도록 변경해야하는 항목 (방향이 지정되었거나 지정되지 않은 경우)은 무엇입니까?Dijkstra의 방향 또는 무향 그래프 알고리즘입니까?

편집 : 참조를 위해, 나는이 문제를 내가이 (공항) 등의 목록을 주어진 마지막 학기를했다 :

나는 그것이 지시되었다 말하고, 최단 경로를 찾는 질문을 받았다
AER,KZN,1.8835 
ASF,KZN,1.3005 
ASF,MRV,1.1204 
CEK,KZN,1.9263 
CEK,OVB,1.6733 
DME,KZN,1.7892 
DME,NBC,2.2319 
DME,UUA,2.3786 
EGO,KGD,1.4649 
EGO,KZN,1.2603 
GYD,NBC,2.0755 

. Github에서 발견 한 Dijkstra의 알고리즘에 넣어 두었습니다. (오픈 컴퓨터 중기 였기 때문에 처음부터 알고리즘을 작성할 시간이 거의 없었습니다.) 제 교수는 반환 된 최단 경로가 잘못되었다고 말했습니다. 목록이 지시되어야하기 때문에 가능한 경로조차도. 이 수정을 위해 알고리즘이나 목록을 수정해야만하는지 잘 모르겠습니다. 결국 돌아온 두 번째로 짧은 경로는 사실상 가장 짧은 경로 였지만 여전히 문제가 무엇인지 궁금합니다.

답변

14

두 가지 모두에 적용 할 수 있습니다. 양방향 연결 (= 반대 방향으로 두 개의 연결)에 연결된 노드들 사이에 그래프 지시 한

무향 그래프는 기본적으로 동일하다 : 여기서 이유이다.

그래서 무향 그래프에서 작동하게 만들 필요가 없습니다. 주어진 노드에서 도달 할 수있는 모든 노드를 예를 들어서 만 알면됩니다. 인접 목록.

+0

내 목록에 각 가장자리에 대해 중복되지만 역전 된 항목이 없으면 지시 된 최단 경로를 제공해야합니까? 내가받은 목록은 지시 받았지만 Dijkstra의 구현을 사용하면 나에게 방향이없는 최단 경로가 부여되었습니다. – Austin

+2

글쎄, 이것은 당신이 발견 한 구현이 무언가가 아닌 방향으로 무언가를 귀하의 목록에있는 항목으로 해석하는 것처럼 들리므로 아마도 알고리즘을 직접 구현해야합니다. 내가 아는 것들은 일반적으로 인접성 목록 (주어진 노드에서 어떤 노드에 도달 할 수 있는지에 대한 정보를 담고있는 목록이다. * => 연결이 지시 됨 *). 이것이 내가 방향이없는 그래프에서 작동하도록 할 필요가 없다고 말한 이유입니다. 그러나 어떤 이유로 든 알고리즘이 연결을 양방향으로 자동 해석하면 변경해야합니다. – Keiwan

+0

@ Keiwan이 게시물은 https://stackoverflow.com/questions/22649416/why-cant-prims-or-kruskals-algorithms-be-used-on-a-directed-graph는 prims 알고리즘이 방향성 그래프에 대해 실패 할 것이라고 말합니다. 따라서 거의 프리믹스 인 Dijkstras는 게시물에서 제시된 예에서도 실패합니다. – WSS

3

그래프는 단지 정점을 연결하는 모서리가 한 방향으로 만 연결할 수는 있지만 다른 모서리는 연결할 수 없다는 것을 의미합니다. 즉, 하나의 꼭지점을 다른 꼭지점에 인접시킬 수 있지만 다른 꼭지점은 첫 번째 꼭지점에 인접하지 않을 수 있습니다.

Dijkstra 알고리즘의 맥락에서 그래프가 방향성인지 무향성인지는 중요하지 않습니다. Dijkstra의 알고리즘은 단순히 정점의 인접한 정점을 참조합니다. 그래프를 방향 전환에서 무향 전환하는 경우 수정해야하는 인접성 목록입니다.

+0

나는 Dijkstra의 구현을 Github에서 뽑아서 공항 목록에서 최단 경로를 찾았 기 때문에 물었습니다. 내 강사가 목록을 작성해야한다고 말했지만 최단 경로는 간접적 인 최단 경로였습니다. 따라서이 경우 알고리즘보다는 목록을 변경해야합니까? – Austin

+1

공항 목록에 방향 정보가 포함되어 있고 알고리즘이 그래프의 방향을 기록하는지 확인해야합니다. 그 조건들 중 어느 하나 (또는 ​​둘다)가 만족스럽지 않고 그에 따라 조정하십시오. 학문적 인 것처럼 들리므로 알고리즘을 직접 구현하는 것이 더 도움이 될 것입니다. 참조는 괜찮지 만 암기 복사 습관을 버려야합니다. –

+0

예를 들어 방향성 가장자리로'AER, KZN, 1.8835'을보고 양방향으로 작업하는 것 외에'KZN, AER, 1.8835'가 필요합니까? 내 목록에는 두 항목이 모두 있다고 믿지 않기 때문에 역 순서는 여전히 가장자리로 간주됩니다. 이게 정상인가? – Austin

3

Djikstras 알고리즘은 일반적으로 긍정적 인 가중치 그래프입니다. 어쩌면 비선형 그래프의 Djikstras 인 BPS (breadth first search) 알고리즘과 혼동을 일으킬 수도 있습니다. Djikstras와 BFS 사이의 차이점은 가중 경로를 처리 할 때 경로 비용 조정 (가중치) &을 현재 노드 이후에 방문 할 노드를 결정할 때 고려해야한다는 것입니다.

1

인접성 목록에서 가장자리로 이동할 때 PriorityQueue에 가장자리를 추가하기 만하면 Dijkstra의 알고리즘을 방향성 및 무향성 그래프로 사용할 수 있습니다. 예를 들어 내 노드 중 하나의 노드가 A에서 B로 무게가 3 인 경우 BI에서 방향이 바뀌면 A에서 B로 가장자리를 다시 추가 할 수 없습니다.

다른 답변과 마찬가지로 가중치와 혼동하지 않도록하십시오. Dijkstra의 알고리즘은 양의 가중치 그래프에서 실행됩니다. 그렇지 않으면 우선 순위 대기열이 쓸모가 없습니다.

예를 들어, 다이어그램의 무게가 (양의 값을 갖기 때문에) Diagkstra의 알고리즘이 작용할 것입니다.

에지가 무향 그래프의 형태로 이중 할당되었다는 오류가있었습니다. 인접성 목록의 가장자리를 복제하지 않으려면 개체의 처음 부분을 파싱 할 때주의해야합니다.