Рефлексивно-транзитивное замыкание
Дано бинарное отношение 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]);
}
}
}
}
