Ошибка в моей реализации Floyd-Warshall C ++ - PullRequest
3 голосов
/ 12 июня 2010

Я получил задание для своего колледжа, уже успешно внедрил Dijkstra и Bellman-Ford, но у меня проблемы с этим.Все выглядит хорошо, но это не дает мне правильный ответ.

Вот код:

void FloydWarshall()
{
    //Also assume that n is the number of vertices and edgeCost(i,i) = 0

    int path[500][500];

    /* A 2-dimensional matrix. At each step in the algorithm, path[i][j] is the shortest path
       from i to j using intermediate vertices (1..k−1).  Each path[i][j] is initialized to
       edgeCost(i,j) or infinity if there is no edge between i and j.
    */

    for(int i = 0 ; i <= nvertices ; i++)
        for(int j = 0 ; j <= nvertices ; j++)
            path[i][j] = INFINITY;

    for(int j = 0 ; j < narestas ; j++) //narestas = number of edges
    {
        path[arestas[j]->v1][arestas[j]->v2] = arestas[j]->peso; //peso = weight of the edge (aresta = edge)
        path[arestas[j]->v2][arestas[j]->v1] = arestas[j]->peso;
    }

    for(int i = 0 ; i <= nvertices ; i++) //path(i, i) = 0
        path[i][i] = 0;

    //test print, it's working fine
    //printf("\n\n\nResultado FloydWarshall:\n");
    //for(int i = 1 ; i <= nvertices ; i++)
    //    printf("distancia ao vertice %d:  %d\n", i, path[1][i]);


    // Here's the problem, it messes up, and even a edge who costs 4, and the minimum is 4, it prints 2.

    //for k = 1 to n
    for(int k = 1 ; k <= nvertices ; k++)
       //for i = 1 to n
       for(int i = 1 ; i <= nvertices ; i++)
           //for j := 1 to n
           for(int j = 1 ; j <= nvertices ; j++)
               if(path[i][j] > path[i][k] + path[k][j])
                   path[i][j] = path[i][k] + path[k][j];


    printf("\n\n\nResultado FloydWarshall:\n");
    for(int i = 1 ; i <= nvertices ; i++)
        printf("distancia ao vertice %d:  %d\n", i, path[1][i]);
}

Я использую этот пример графика, который я сделал:

6 7

1 2 4
1 5 1
2 3 1
2 5 2
5 6 3
6 4 6
3 4 2

означает, что у нас есть 6 вершин (от 1 до 6) и 7 ребер (1,2) с весом 4 ... и т. д.

Если кому-то нужна дополнительная информация, я могу ее предоставить, простонадоело смотреть на этот код и не найти ошибку.

Ответы [ 3 ]

2 голосов
/ 12 июня 2010

Неважно, я взял перерыв, чтобы что-нибудь съесть, и обнаружил ошибку.

Бесконечность определяется как INT_MAX, поэтому, как только вы добавляете в нее что-то, она становится отрицательной.

Я определил только что-то большое (для моей проблемы, например, более 9000, ни один путь к графу не займет больше этого), и он работает нормально.

Но могу ли я знать, почему вы предложили Инь? я этого не понял.

Спасибо

0 голосов
/ 12 июня 2010

Кроме того, не является ли начало и конец вашей итерации по пути одним и тем же в нескольких местах? Вы, вероятно, хотите, чтобы они работали от 0 до nvertices-1; т.е. for (int i = 0; i < nvertices; i++).

0 голосов
/ 12 июня 2010
 if(path[i][j] > path[i][k] + path[k][j])
  path[i][j] = path[i][k] + path[k][j];

сделайте некоторую проверку здесь.например, если path [i] [k] и path [k] [j] не бесконечны и i! = ji! = k и k! = j.

...