не могу понять в чем ошибку в алгоритме флойда

В данной программе три матрицы : 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;
}

Ответы (0 шт):