не могу понять в чем ошибку в алгоритме флойда
В данной программе три матрицы : A(матрица смежности), C(матрица кратчайших путей), F(матрица для сохранения номера промежуточного k ,путь через который будет минимальным) . Проблема в том , что программа неправильно считает кратчайшие пути и матрицу F, подскажите пожалуйста где может быть проблема ? P.S (нуль в матрице F значит что "серединного пункта" между i и j нету)
#include <iostream>
#include <ctime>
#include <Windows.h>
#include <iomanip>
using namespace std;
//int M = 1000;//граница
void Print(int** A, int size)
{
//вывод номеров узлов
for (int i = 0; i < size; i++)
{
cout << setw(3) << i;
}
cout << endl;
//вывод значений графа
for (int i = 0; i < size; i++)
{
cout << i;
for (int j = 0; j < size; j++)
{
cout << setw(3) << A[i][j];
}
cout << endl;
}
cout << endl;
}
void Floyd_Algorithm(int** A, int** C, int **F, int size)
{
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
C[i][j] = A[i][j];
for (int k = 0; k < size; ++k)
{
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < size; ++j)
{
if (C[i][k] != -1 || C[k][j] != -1)
{
if (C[i][k] + C[k][j] < C[i][j])
{
C[i][j] = C[i][k] + C[k][j];
F[i][j] = k;
}
else
{
F[i][j] = 0;
}
}
else
{
F[i][j] = 0;
}
}
}
}
}
int main()
{
int size;
cout << "Enter the size of graph" << endl;
cin >> size;
system("cls");
//основная матрица
int** A = new int* [size];
for (int i = 0; i < size; i++)
{
A[i] = new int[size];
}
//поиск кратчайших путей
int** C = new int* [size];
for (int i = 0; i < size; i++)
{
C[i] = new int[size];
}
//матрица промежуточных вершин (для сохранения )
int** F = new int* [size];
for (int i = 0; i < size; i++)
{
F[i] = new int[size];
}
//инициализация путей в узлах
srand(time(0));
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (i == j) A[i][j] = 0;
else if (1 + rand() % 10 > 2)
{
A[i][j] = 1 + rand() % 9;
}
else
{
A[i][j] = -1;
}
}
}
cout << "General matrix" << endl;
Print(A, size);
Floyd_Algorithm(A,C,F,size);
cout << "Matrix of shortest ways" << endl;
Print(C, size);
cout << "Remember way" << endl;
Print(F, size);
//удаление
for (int i = 0; i < size; i++)
{
delete[] A[i];
}
delete[] A;
for (int i = 0; i < size; i++)
{
delete[] C[i];
}
delete[] C;
for (int i = 0; i < size; i++)
{
delete[] F[i];
}
delete[] F;
}