2017-04-18 4 views
1

은 내가 목적지에 도달하기 위해 노력하고 다음 노드를 제공하는 경로 행렬을 생성 할 때, 그 제외하고는 제대로 작동 가중 이중 음자에 대한 C에서 플로이드의 알고리즘 ++의 기능을 구현 한 즉시 정점을두고 행렬의 소스에서 다음 노드 대신 대상 앞에옵니다. 거리 매트릭스 (dist)가 올바르게 나오고 소스와 대상 사이에 최대 하나의 노드가 있으면 전체 경로 매트릭스가 정확합니다. 따라서 꼭지점 i에서 j까지의 최단 경로가 길면 path [i] [j]는 i와 연결된 k 값과 같아야합니다. 대신 j와 연결된 k 값은 이유를 파악할 수 없습니다. 이 기능은 아래와 같습니다. 정점에서 긴 최단 경로가 존재 그렇다면플로이드의 최단 경로 알고리즘 C++

void floyd(const Graph<City>& g, double**& dist, int**& path) 
{ 
    int n = g.size(); 
    for (int i = 1; i <= n; i++) 
    { 
     for (int j = 1; j <= n; j++) 
     { 
      path[i][j]=0; 
      if (i==j) 
       dist[i][j]=0; 
      else if (!g.isEdge(i, j)) 
       dist[i][j]=INFINITY; 
      else 
       dist[i][j]=g.retrieveEdge(i, j); 
     } 
    } 
    for (int i = 1; i <= n; i++) 
    { 
     for (int j = 1; j <= n; j++) 
     { 
      for (int k = 1; k <= n; k++) 
      { 
       if ((dist[i][k]!=INFINITY) && (dist[k][j]!=INFINITY) && k!=i && k!=j && i!=j) 
       { 
        if ((dist[i][j]) > (dist[i][k]+dist[k][j])) 
        { 
         path[i][j]=k; 
         dist[i][j]=dist[i][k]+dist[k][j]; 
        } 
       } 
      } 
     } 
    } 
} 
+2

먼저 코드에서 당신이 상상 디자인에서 벗어난 위치를 확인하기 위해 디버거를 사용합니다. 둘째, C++에서 1 기반 배열을 위장하는 것은 위험한 게임입니다. 하나씩 메모리를 겹쳐 쓸 수 있습니다. 메모리에 기본 1 어레이를 사용 – PaulMcKenzie

+0

그냥 발생 몇 낭비 장소, 나는이 문제에 대한 조심해야했으나 디버거를 사용하는 나는 그것이 내가 경로를 덮어있어 어떻게해야 찾을에만 수 있었다 [I] [J ]. 부적절한 값으로 가끔 겹쳐 쓰여지고 있습니다. 그리고 내가 뭘 할지라도 그 이유를 알지 못합니다. – Rory

+0

"이유 없음"으로 값을 덮어 쓰는 경우 1 기반 배열이 원인 일 수 있습니다. 다시 말하지만, 1 기반 배열을 사용하는 것은 메모리 덮어 쓰기 또는 요소 0이 가비지 값 (부적절한 메모리 액세스가 아닌) 인 실수로 요소 0을 사용하는 경우가 있습니다. – PaulMcKenzie

답변

0

I J에 다음 경로 [I] [J] AK I 접속 값 대신 그것의 AK 값 J에 접속되고 I 알아낼 수 같아야 왜.

불행하게도 모두. 귀하의 구현에서 path[i][j]i 바로 뒤에 오는 k 값과 같아야하고, path[i][j]이 현재 k 값인 관찰이 j 바로 앞에 오도록 보장하는 것도 없습니다. (두 번째 점을 확인하기 위해 더 많은 몇 가지 샘플을 시도하십시오.)

구현에 의해 보장되는 유일한 방법은 정점 path[i][j] == kj 버텍스 정점 i에서 최단 경로 어딘가에 놓여 있다는 점이다.

따라서 당신은 수행하여 재귀 적 경로를 검색 할 수 있습니다

get_path(i, j): 
    k = path[i][j] 
    get_path(i, k) + k + get_path(k, j) 

가 명확히 데 당신이 저장할 수 there does exist a method, 그 path[i][j]i 직후 오는 정점이되도록.