은 내가 목적지에 도달하기 위해 노력하고 다음 노드를 제공하는 경로 행렬을 생성 할 때, 그 제외하고는 제대로 작동 가중 이중 음자에 대한 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];
}
}
}
}
}
}
먼저 코드에서 당신이 상상 디자인에서 벗어난 위치를 확인하기 위해 디버거를 사용합니다. 둘째, C++에서 1 기반 배열을 위장하는 것은 위험한 게임입니다. 하나씩 메모리를 겹쳐 쓸 수 있습니다. 메모리에 기본 1 어레이를 사용 – PaulMcKenzie
그냥 발생 몇 낭비 장소, 나는이 문제에 대한 조심해야했으나 디버거를 사용하는 나는 그것이 내가 경로를 덮어있어 어떻게해야 찾을에만 수 있었다 [I] [J ]. 부적절한 값으로 가끔 겹쳐 쓰여지고 있습니다. 그리고 내가 뭘 할지라도 그 이유를 알지 못합니다. – Rory
"이유 없음"으로 값을 덮어 쓰는 경우 1 기반 배열이 원인 일 수 있습니다. 다시 말하지만, 1 기반 배열을 사용하는 것은 메모리 덮어 쓰기 또는 요소 0이 가비지 값 (부적절한 메모리 액세스가 아닌) 인 실수로 요소 0을 사용하는 경우가 있습니다. – PaulMcKenzie