Рефлексивно-транзитивное замыкание

Дано бинарное отношение R над множеством чисел Х={1,2,3,...,N}. Требуется найти его рефлексивно-транзитивное замыкание, используя алгоритм Флойда-Уоршелла. Сигнатура: В первой строке записано одно целое число N - размер множества(1<=N<=500). Далее идет N строк по N символов в каждой, задающие отношение R. j-ый символ i-ой строки равен 1, если пара (i, j) лежит в отношении R, и равен 0 в противном случае. Вывести N строк по N символов в каждой - рефлексивное и транзитивное замыкание отношения R, описанное в том же формате, что и исходное отношение R во входных данных. мой код вроде написан правильно, но на выходе получается какой-то бред, так еще иногда и с минусами. Подскажите в чем ошибка, пожалуйста :)

#include<stdio.h>
int main(){
    int N;
    int X[501][501];
    scanf("%d", &N);
    for(int i=0; i<(N-1); i++){
        scanf("%d\n", &X[i]);
         X[i][i]=1;
    }
    for(int k=0; k<N; k++){
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                if( (X[i][k]==1) && (X[k][j]==1) )
                        X[i][j]=1;
            }
        }
    }
    for(int i=0; i<N; i++){
        printf("%d\n", X[i]);
    }
}

Upd: что-то чуть ближе к истине. Вывод теперь единицами и нулями, без минусов. Однако выводится все по 1 символу в строке и не совпадает с примером :)

int main(){
    int N;
    int X[501][501];
    scanf("%d", &N);
    for(int i=0; i<(N-1); i++){
        scanf("%d\n", &X[i]);
         X[i][i]=1;
    }
    for(int k=0; k<N; k++){
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                if( (X[i][k]==1) && (X[k][j]==1) )
                        X[i][j]=1;
                        printf("%d\n", X[i][j]);
            }
        }
    }
}

пример ввода-вывода


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