¿Por qué es (1,1) parte del siguiente cierre transitivo?

Creo que (1,1) no debería incluirse en el cierre.

Si intenta crear un cierre manualmente, se daría cuenta de que (1,1) no debe agregarse.

(1,2), (2,3) así se agrega (1,3)

y así sucesivamente, podría seguir agregando hasta llegar a una saturación.

Aquí está mi código en C ++ y la salida usando el Algoritmo de Warshall, que es de naturaleza O ([matemática] N ^ 3 [/ matemática]). Podrías hacerlo mejor que esto, pero Warshall es fácil de implementar.

#include
#include
#include
#include

usando el espacio de nombres estándar;

cierre nulo (int gráfico [] [v], int v) {
para (int i = 0; i <v; i ++) {
para (int j = 0; j <v; j ++) {
para (int k = 0; k <v; k ++) {
gráfico [j] [k] = gráfico [j] [k] || (gráfico [j] [i] && gráfico [i] [k]);
}
}
}
regreso ;
}

int main (nulo) {
// Nuestro caso de prueba.
int gráfico [5] [5] = {
{0,1,0,0,0},
{0,0,1,0,0},
{0,0,0,1,1},
{0,1,0,0,0},
{0,0,0,1,0}
};
int v = 5;

// Llamada de función
cierre (gráfico, v);

// Imprimir el cierre.
para (int i = 0; i <v; i ++) {
para (int j = 0; j <v; j ++) {
cout << gráfico [i] [j] << "";
}
cout << endl;
}

devuelve 0;
}

Aquí está la salida.

Un enlace que discute el cierre transitivo y el Algoritmo Warshall.

http://cs.winona.edu/lin/cs440/c…

Espero que esto ayude. 🙂