Ayuda implmentación algoritmo warshall

Cerrado
Luar - 12 may 2022 a las 12:41
Hola,



necesito ayuda para implementar el algoritmo warshall, que ira recogiendo varias filas con dos ciudades, que se suponen que entre todas las ciudades hay conexion pasando a traves de otras. Entonces se busca con este algoritmo que vaya indicando si en cada fila devuelva true o false segun vaya recorriendo las filas. Yo al menos he entendido asi el problema.

El primer problema que tengo es que, no consigo crear la matriz dinamica para guardar las ciudades en cada fila de la matriz, al leer de nuevo el fichero de texto se cuelga el programa, y no veo la razon. Vereis que he puesto varios printf(variable), para ver donde se quedaba colgado el programa, y muestra por pantalla el numero de filas.
Y despues lo que no se es, en que tipo de variable debo recoger los resultados? en una matriz de tipo int?, y si es asi luego es ir recorriendo la matriz viendo cuantos 1, obtiene?y como discernir que por el numero de 1 que devuelve el algoritmo, no hay ninguna ciudad aislada?. Como imaginareis es un ejercicio que me han puesto, y estoy bloqueado desde hace dias haciendo pruebas. Pego el codigo:

void warshall (bool *c, bool *a, unsigned int nNodos)
{
int i,j,k;
for (i = 0; i < nNodos; i++)
for (j=0; j< nNodos; j++)
//A[i][j] = C[i][j];
a[(i*nNodos)+j] = c[(i*nNodos)+j];

for (k = 0; k < nNodos; k++)
for (i = 0; i < nNodos; i++)
for (j=0; j< nNodos; j++)
//A[i][j] = A[i][j] || A[i][k] && A[k][j]; //Si hay un camino de ‘i’ a ‘j’ o si hay //un camino de ‘i’ a ‘j’ pasando por ‘k’
a[(i*nNodos)+j] = a[(i*nNodos)+j] || a[(i*nNodos)+k] && a[(k*nNodos)+j]; //Si hay un camino de ‘i’ a ‘j’ o si hay //un camino de ‘i’ a ‘j’ pasando por ‘k’
}


int main()
{
FILE *fichero;

bool *a;
bool *test;
int n_Nodos=19;
char * campo;
char ** datos;
int filas=0;
int MaxLinea=maxLinea;
char lineaFinal[maxLinea];
char ciudad1[maxCiudad];
char ciudad2[maxCiudad];
char distancia[maxCiudad];
char linea[maxLinea];


fichero= fopen( "carreteras.txt", "r");
if(fichero==NULL)
{
printf("No se ha podido abrir el fichero.\n");
exit(1);
}

else
{

while(fgets(linea,MaxLinea,fichero))
{
filas++;
}

printf("%d\n",filas);

fichero= fopen( "carreteras.txt", "r");
datos=malloc(sizeof(char*)*filas);
datos=malloc(sizeof(char)*3);

// se lee cada fila de todo el fichero de elementos
while(fscanf(fichero, "%s %s %s", ciudad1, ciudad2, distancia) == 3)
{
datos[filas][0]=ciudad1;
printf("El valor de la linea %s \n", ciudad1);

datos[filas][1]=ciudad2;
printf("El valor de la linea %s \n", ciudad2);

datos[filas][2]=distancia;
printf("El valor de la linea %s \n", distancia);

}
}
getchar();
a = (bool *)malloc(sizeof(bool)*(n_Nodos * n_Nodos));
// aqui no tengo claro si se recoge asi los resultados del algoritmo
int resul[filas][3]=warshall (a,datos,n_Nodos);

return 0;
}