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.
- ¿Para qué sirve la matriz dispersa?
- Cómo calcular integral si se da el campo vectorial
- ¿Cuál es la mejor fuente para aprender álgebra lineal más avanzada?
- ¿Cuál es el significado físico del concepto de matriz?
- ¿Cómo se conectan las ecuaciones diferenciales y el álgebra lineal?
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. 🙂