2009-11-26 4 views
2

나는 X 노드와 Y 가장자리와 그래프가 있습니다. 가중치 적용 요점은 한 노드에서 시작하고 다른 노드에서 멈추는 것입니다. 이제 여기에 문제가 온다.그래프 이론 질문, Java. 어느 알고리즘을 달성하기 위해 다음을 달성

문제를 시각화하십시오. 가장자리는 도로이며, 가장자리 무게는 도로 주행 차량의 최대 무게 한계입니다. A에서 B까지 가능한 가장 큰 트럭을 운전하고 싶습니다. 주어진 경로를 취하는 트럭의 최대 허용 중량은 해당 경로의 모든 가장자리 중 가장 작은 무게입니다. A부터 B까지의 모든 경로에 대해 허용되는 최대 가중치 최대 값을 원합니다.

이 문제에 대해 일종의 Dijkstra 알고리즘을 사용할 수 있습니까? 구현할 수있는 알고리즘의 형태로이 문제를 표현하는 방법을 잘 모르겠습니다. 어떤 도움이라도 대단히 감사합니다.

업데이트 : 나는 나를 위해 작동하지 않는 일들을 테스트했습니다. 노드는 들어오는 가장자리마다 하나의 최대 트럭을 가져야합니다.

+0

"... A에서 B까지.이 경로에서 가장 작은 가장자리 인 int를 반환하지만 A에서 B로가는 다른 경로와 비교할 때 가장 큰 가장자리" 뭐 ? 당신은 "A에서 B로 가장 작지만 A에서 B로 가장 큰 것"이라고 말합니다. –

+0

A에서 B까지 더 많은 경로가있을 수 있습니다. 가장 큰 트럭을 A에서 B로 운전하고 싶습니다.선택한 모서리는 선택한 경로의 가장 작은 모서리이지만 A에서 B까지가는 다른 루트의 가장 작은 모서리와 비교할 때 가장 큰 것입니다. – Algific

답변

3

Dijkstra의 알고리즘이 작동해야하지만,이 경우 거리가 약간 이상합니다. "거리"는 노드에 도달 할 수있는 최대 크기의 트럭입니다. 노드 v에 대해 M [v]라고 부르 자. 가장 큰 M [v]에서 가장 작은 M [v] (보통 다이크 스트라와 반대) 순서로 노드를 처리하고 v에서 w까지 각 에지 e를 계산해야한다.

M[w] = max(M[w], min(e.weight, M[v])) 
+0

니스, 이제는 모든 노드 비용이 integer.max까지 초기화됩니다. 내가 이렇게 할 때 기본 비용은 무엇이겠습니까? – Algific

+0

무한대로 시작하는 소스 노드를 제외하고 모든 노드의 기본값은 0이어야합니다. –

+0

완벽 해, 지금 일식으로 돌아갈거야. 고마워요! – Algific

1

Ford-Fulkerson algorithm을 사용하여 효율적으로 해결할 수있는 maximum flow problem과 거의 비슷합니다.

Keith가 지적한 바와 같이, 트럭을 여러 부분으로 나눌 수 없기 때문에 최대 알고리즘은 경로가 최대화 된 경로 만 찾을 수 있도록 약간 변경해야합니다. 당신이 요구하는지 실제로 더 당신이 arent, 나는 상황을 제대로 이해한다면 최대 유량 링크 그래서

+3

최대 흐름이 좋지 않습니다. 그러면 트럭을 조각으로자를 수 있습니다. 각각 다른 방식으로 보내십시오. –

+0

@Keith : 사실, 최대 흐름과 같지 않음. 나는 잘게 썬 트럭의 아이디어를 좋아하지만. ;-) –

0

난 당신이

Shortest path

편집을 찾고 생각하지 "A에서 B까지 운전할 수있는 가장 큰 트럭은 무엇입니까?"

Dijkstra의 알고리즘을 적용하려면 "비용"을 모델링하는 방법이 필요합니다. 표준 구현을 사용하려면 가중치의 역수를 비용에 할당 할 수 있습니다. 따라서 가장 높은 비용 엣지는 가장 낮은 최대 가중치를 갖는 에지입니다. 물론, 좋은 정수를 사용하고 싶으므로 실제로는 반전을 사용하는 대신 비교를 간단히 수정할 수 있습니다.

0

일종의 최소 스패닝 트리 방식을 사용할 수 있습니다. A와 B가 연결될 때까지 노드를 한 번에 한 에지 씩 연결하십시오. 그래프에 마지막으로 추가 한 에지는 A에서 B로 전환하기 위해 교차해야하는 가장 낮은 흐름 에지입니다. 아마도 가장 효율적인 솔루션이 아닐 수 있습니다 (O (N) 최악의 경우).하지만 적어도 똑바로.

0

이것은 최단 경로 문제도 최대 흐름 문제도 아닙니다. 실제로 문제는 없습니다. 그는 명시했다 - 모든 경로 A에서 B까지의 최대 무게를 원한다. 그래서 BFS에 의해 A에서 모든 경로를 생성해라. B로 끝나는 모든 경로에 대해 경로 가장자리의 최소 가중치를 찾습니다.

+0

을 실제로 저장하는 방법 당신이 BFS를하는 것처럼? – Algific

+0

그러면 그래프가 작지 않고 많은 경로가 커질 수 있다는 뜻입니까? 나는 최대 허용 무게로 A에서 B까지의 단일 경로에 관심이 있다고 생각하십니까? 이를 수행하십시오 : 알고리즘을 사용하여 A-B 경로를 찾으십시오. 다이크 스트라. 가장 작은 무게의 가장자리를 제거하십시오. A-B 경로를 다시 찾으십시오. A-B 경로가 없을 때까지 계속하십시오. 가장자리를 제거하기 전에 존재 한 마지막 경로는 최대 가중치가있는 경로가됩니다. – zufar

0

Dijkstra's algorithm은 최대 트럭 무게의 역수를 가장자리 비용으로 사용하고 개별 가장자리 무게의 최대 값을 총 경로 비용으로 사용하십시오. 즉 edge_cost

1/(최대 허용 트럭 무게) 주어진 행의 total_cost은 행의 모든 ​​에지들의 개별 edge_cost '(S)의 최대이다 같다.

0

위의 다양한 대답은 수정 된 가중치 함수를 사용한 Dijkstra 알고리즘을 간단히 제안합니다. 예를 들어 w(e) = -c(e) 또는 'w (e) = 1/c (e)'입니다. 여기서 w(e)은 알고리즘에서 사용하는 가장자리의 가중치이고 c(e)은 원래 문제 공식에서 가장자리의 용량입니다.

다음은 작동하지 않습니다.

부정확 한 결과를 초래할 수있는 반례를 쉽게 만들 수 있습니다. 예를 들어, 그래프 고려해

a---3-->b---3--->c---3-->d 
\      ^
    \      | 
    \----------3----------| 

a의 값을 가정한다 ('알고리즘 제제 노드 a의 거리)는 0이다. a에서 d까지의 두 경로는이 문제에서 동일합니다. 그러나 짧은 경로를 사용하는 동안 가장자리 용량을 무시하면 distance (d)는 긴 경로를 사용하여 (-3)+(-3)+(-3) = -9이며 -3이됩니다. 가장자리 용량을 역산하면 긴 경로를 사용하는 거리 (d)는 (1/3)+(1/3)+(1/3)=1이되고 짧은 값은 (1/3)이됩니다.

무엇 작업 알고리즘의 완화 공정을 변경, 즉 대신 첨가 (+가)의 기능을 이용하여 각각 사용하는 함수 (<) 덜보다 것이다 min 및보다 큰 (>)을하고 min-heap 대신 max-heap을 사용하십시오. 모서리 가중치를 무효화하고 덜 사용하는 경우 마지막 두 개를 피할 수 있습니다. + 연산자가 필요하기 때문에 @이 필요합니다. 값은 이고 +a=0 만 사용할 수 있습니다.

키스 랜달 (Keith Randall)이 처음으로 제시 한 정답입니다.

수정 된 알고리즘이 올바른지 공식적으로 증명하는 것이 좋습니다. 입증해야 할 내용은 다음과 같습니다. - u이 루프 반복에서 최대 값이 d(u) 인 노드 인 경우 표시되지 않은 노드가 포함 된 경로는 보다 큰 거리를 u에 생성 할 수 없습니다.

표시되지 않은 노드는 다른 모든 노드가 'u'거리보다 작거나 같기 때문에 직관적으로 볼 수 있습니다 (최대 거리가있는 노드로 u을 선택했기 때문에). 그리고 생성 된 거리 경로는 min의 연속적인 호출에 의해 생성되므로 더 작지 만 커질 수는 없습니다.

관련 문제