9개의 댓글이 있습니다.
-
-
Being -
벨만-포드 알고리즘의 수행 도중에는 s ---> v 까지의 중간 계산된 최단 거리는 s ---> u -> v 가 아니거나 u가 아닌 다른 정점인 x를 거친 경로인 s ---> x -> v 를 따를 수 있지만, 알고리즘의 수행이 종료되면 모든 정점에 대한 최단 경로는 정상적으로 계산됩니다.
다른 말로, 벨만-포드는 각 바깥 루프가 수행될 때마다 최단 경로를 구성하는 간선의 수가 1, 2, .., V - 1개 이하인 최단 경로를(엄밀히 말하면, 간선의 수가 i개 이하인 최단 경로보다 좋거나 같은 경로를) 계산함으로써 최단 경로를 계산하는 알고리즘입니다. 따라서 질문해주신 바와 같은 경우는 u -> v 간선이 s ---> u 까지의 최단 경로가 갱신될 때마다 계속해서 relax 될 것이므로 발생하지 않습니다.
11년 전 link
-
-
-
mihaly -
//Being
답변 감사합니다. optimal substructure였네요. "계산하는 값의 정의를 잘 잡음으로써 optimal substructure를 구성합니다." 이 말은 즉 optimal substructure을 구성해야만 적용할 수 있다는 말일까요?
DRUNKEN 문제에서
5 5
1 10 30 100 1
1 2 30
1 3 20
2 4 20
3 4 20
4 5 5
1
1 5입력을 벨만-포드 알고리즘으로 구해봤는데 145가 나와야하는데 155가 답으로 나와서요. 이 경우가 제가 생각했던 본문에 썼던 경우이고요.
11년 전 link
-
-
-
mihaly -
핵심적인 코드만 적으면 아래와 같습니다.
naive하게 생각해서 경로 길이 합과 그 경로 상의 delay값의 최고값을 저장하고 이를 relaxation의 조건으로 활용했는데 뭔가 잘못된 접근인 것 같긴 하네요.// Initialization fill(upper, upper + v, pINF); fill(delay, delay + v, 0); // Solve upper[from] = 0; int init_delay = d[from]; d[from] = 0; for ( int i = 0; i < v - 1; i++ ) { bool relaxed = false; for ( int j = 0; j < v; j++ ) { for ( vector< pair<int, int> >::iterator it = m[j].begin(); it != m[j].end(); it++ ) { if ( upper[j] == pINF ) continue; if ( upper[j] + it->second + max(delay[j], d[j]) < upper[it->first] + delay[it->first] ) { upper[it->first] = upper[j] + it->second; delay[it->first] = max(delay[j], d[j]); relaxed = true; } } } if ( !relaxed ) break; } cout << upper[to] + delay[to] << endl; // Ending d[from] = init_delay;
생각을 더 해봐야겠습니다.
11년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
mihaly
JMBook으로 최단경로를 구하는 알고리즘들을 공부하고 있습니다.
다익스트라, 벨만-포드, 프로이드 알고리즘까지 봤는데요.
책을 다 안 읽고 DRUNKEN 문제를 풀려고 했는데 벨만-포드 알고리즘으로 시도를 했었습니다.
근데 안 풀리더라고요 잘 풀리는 것 같은 느낌은 들었는데.
그래서 좀 생각을 해봤는데 벨만-포드 알고리즘으로 풀리지 않는 경우가 있더라고요.
왜 풀리지 않을까 생각을 해보니 s를 시작점이라 하고 두 정점 u, v이 있고 s부터 v까지의 최단 경로가 s -> ... -> u -> v라고 했을 때 이 경로에서의 s -> ... -> u가 s에서 u까지의 최단경로가 아닐 수도 있더라고요.
그래서 생긴 의문점인데 벨만-포드 알고리즘은 경로의 성질이 optimal structure여야 적용할 수 있는 알고리즘인가요?
그리고 프로이드 알고리즘도 공부했는데 그것도 optimal structure의 성질을 이용하는 것 같은데 맞는건가요?
요약: 최단 경로 알고리즘들이 optimal structure에만 적용이 가능한 것인지?
감사합니다.
11년 전