너비를 먼저 시작하면 길이가 1이고 그 다음에 2, 3, 4 등의 경로가 수집됩니다. 길이 k에서 k + 1까지 다음 단계에서 종점이 이미 일부 경로에서 사용되지 않은 경우 일부 경로에만 종점을 추가합니다. 그것은 당신이 덜 또는 동등하게 최적의 경로를 버리는 것을 보장합니다.
원점 이외에도 모든 경로 점에는 명확한 들어오는 가장자리가 있습니다. 따라서 데이터 구조로서 점 당 들어오는 가장자리 (또는 no_incoming)를 저장할 수 있습니다. 이렇게하면 최적의 경로가 삭제됩니다.
케이스 : 마찬가지로 최적 경로가 몇 인입 에지를 갖는 데이터 포인트로서 표현 될 수있는 최적의 경로와 동일. 길이 k에서 k + 1로 가면서 모든 새로운 종점이 수집됩니다.
- 경로에 후보 엔드 포인트가 있지만 새 (k + 1) 개의 종점에없는 경우 후보 최적 경로이며 삭제됩니다. 재귀가 실패합니다.
- 후보 엔드 포인트가 최신 인 경우 새로운 최적 경로가 발견됩니다. 재귀가 계속됩니다.
- 후보 종점이 새 종점에만있는 경우 대체 최적 경로가 발견됩니다. 재귀도 멈 춥니 다.
코드
public void determineAllPaths(Grid grid, Point origin) {
this.grid = grid;
this.origin = origin;
grid.setOnPath(origin, null); // to, from
Set<Point> priorEndPoints = Collections.singleton(origin);
determinePaths(priorEndPoints);
}
private void determinePaths(Set<Point> priorEndPoints) {
if (priorEndPoints.isEmpty())
return;
Set<Point> nextEndPoints = new HashSet<Point>();
for (Point priorEndPoint : priorEndPoints) {
for (Point nextEndPoint : priorEndPoint.naybours()) {
if (grid.isOnPath(nextEndPoint)
&& !nextEndPoints.contains(nextEndPoint)) {
continue;
}
//if (nextEndPoints.contains(nextEndPoint)) {
// continue;
//}
grid.setOnPath(nextEndPoint, priorEndPoint); // to, from
nextEndPoints.add(nextEndPoint);
}
}
determinePaths(nextEndPoints);
}
에 대해 정확히 BFS 익스트라를 얻을 호출하여 왜 당신이 대안을 찾고있는
는주? – svick
다른 자연적인 대안은 깊이 우선 검색입니다. 그러나 @svick이 왜 대안이 필요한지 묻는 것에 동의합니다. –
나는 모든 가능성을 탐구하고 있는데, 대부분이 문제가되는 것을 대상으로하는 것이 궁금하다. 그리고 막 다른 길은 어떨까요? 가장 좋은 방법은 각 사각형에서 출발점 중 적어도 하나까지의 경로를 찾는 것이라고 가정하는 것이 안전합니다. – DArkO