Título: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 12 Mayo 2022, 11:56 am 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: Código
Muchas gracias por la ayuda! Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: MAFUS en 12 Mayo 2022, 14:04 pm Pasa por aquí una copia del archivo de texto que usas.
Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 12 Mayo 2022, 14:27 pm Vale, gracias:
Corunya Vigo 171 Corunya Valladolid 455 Vigo Valladolid 356 Valladolid Bilbao 280 Valladolid Madrid 193 Oviedo Bilbao 304 Bilbao Madrid 395 Bilbao Zaragoza 324 Madrid Zaragoza 325 Zaragoza Barcelona 296 Barcelona Gerona 100 Valencia Barcelona 349 Madrid Badajoz 403 Madrid Jaen 335 Madrid Albacete 251 Albacete Valencia 191 Albacete Murcia 150 Murcia Granada 284 Murcia Valencia 241 Granada Jaen 99 Granada Sevilla 256 Jaen Sevilla 242 Sevilla Cadiz 125 Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: K-YreX en 12 Mayo 2022, 22:37 pm Citar Ahora estoy que no se como en una matriz dinamica de cadenas de texto, compararla con una cadena de texto que seria una ciudad, y si coincide el campo de la matriz, se le da un valor numerico a esa ciudad Este problema está ya mencionado en el otro tema que abriste para esto mismo: https://foro.elhacker.net/programacion_cc/ayuda_con_fichero_y_cadenas_en_c-t514770.0.htmlCitar Me ha mostrado una tabla con 1 y 0, aunque no se si acertaba bien en las conexiones de los nodos Si no me he equivocado, esta matriz representa el número de ciudades por las que tienes que pasar para llegar desde la ciudad i hasta la ciudad j. (Por si te fias y quieres comparar)(0 = ya estás en esa ciudad | -1 = no se puede llegar de la ciudad i a la ciudad j) Código: [INFO ] ---------- NODE LIST ---------- [ 0 - Corunya] [ 1 - Vigo] [ 2 - Valladolid] [ 3 - Bilbao] [ 4 - Madrid] [ 5 - Oviedo] [ 6 - Zaragoza] [ 7 - Barcelona] [ 8 - Gerona] [ 9 - Valencia] [10 - Badajoz] [11 - Jaen] [12 - Albacete] [13 - Murcia] [14 - Granada] [15 - Sevilla] [16 - Cadiz] [INFO ] -------------------- WARSHALL MATRIX -------------------- 0 1 1 2 2 -1 3 4 5 4 3 3 3 4 5 4 5 -1 0 1 2 2 -1 3 4 5 4 3 3 3 4 5 4 5 -1 -1 0 1 1 -1 2 3 4 3 2 2 2 3 4 3 4 -1 -1 -1 0 1 -1 1 2 3 3 2 2 2 3 4 3 4 -1 -1 -1 -1 0 -1 1 2 3 2 1 1 1 2 3 2 3 -1 -1 -1 1 2 0 2 3 4 4 3 3 3 4 5 4 5 -1 -1 -1 -1 -1 -1 0 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 2 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 -1 -1 -1 1 2 -1 -1 -1 -1 -1 -1 -1 2 3 1 -1 3 0 1 2 3 4 -1 -1 -1 -1 -1 -1 -1 2 3 1 -1 2 -1 0 1 2 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 0 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 PD: Está hecho con el método mencionado en el otro tema al que hacía referencia. :rolleyes: Y otras cosillas:
Código
Con eso yo creo que quedaría todo comentado :silbar: :silbar: Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 13 Mayo 2022, 00:04 am Hola!,
perdona no vi tu ultimo mensaje en el otro tema :-( casualmente mientras me escribias este ultimo mensaje, estaba implementandolo con estructuras como sugerias en el otro tema. Y ya llama bien a al metodo warshall, pero creo devuelve mal los valores. Es que no me aclaro mucho con el metodo. Lo he tenido que modificar, porque si le implementaba tal como estaba, como le puedo asignar a una matriz de tipo bool, una matriz de tipo int que es donde van concatenadas las ciudades asignadas por una numeracion?. A mi me da como resultado la tabla con todos 1, supongo que no esta bien. En la tabla que compartes, el 0 es la ciudad actual, el -1 una ciudad inalcanzable, el 1 supongo que sera una ciudad alcanzable, pero los valores 4, 5 y 6 que aparecen en la tabla que significan. Pego el nuevo codigo por si esta muy mal lo repito, y si solo hay que retocarlo un poco lo del metodo warshall que la verdad es voy perdido como funciona, solo modifico ese metodo: En parte ya estaban las correciones que me has comentado, revisare las otras que no estan realizadas. Pego el codigo. Muchas gracias! Código
Y el resultado que muestra por pantalla: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: K-YreX en 13 Mayo 2022, 15:56 pm Al publicar código agrega en la primera etiqueta el lenguaje para facilitar un poco más la lectura. Tal que así:
[code=c] Aquí pones tu código [/code] En los anteriores posts te lo he ido agregando yo pero para futuro. :rolleyes: Citar En la tabla que compartes, el 0 es la ciudad actual, el -1 una ciudad inalcanzable, el 1 supongo que sera una ciudad alcanzable, pero los valores 4, 5 y 6 que aparecen en la tabla que significan. El valor del elemento [X][Y] es el número de ciudades por las que tienes que moverte para llegar desde la ciudad X hasta la ciudad Y.Es decir, cuando pone 1 significa que llegas directamente pero cuando pone 2 significa que tienes que pasar por una ciudad intermedia, y así sucesivamente... Citar A mi me da como resultado la tabla con todos 1, supongo que no esta bien. Esto es un problema de concepto. El algoritmo Warshall espera/trabaja con una matriz de entrada que está compuesta por 0s y 1s. El 0 en una casilla significa que no se puede llegar del elemento X al elemento Y y el 1 que sí que se puede.La implementación interna de la función warshall() parece correcta. El problema está en el input. La matriz que tú le estás haciendo llegar es la matriz 'claves' que no contiene la información esperada sino que contiene una serie de "índices" que has ido guardando tú en la parte final del código. Te recomiendo empezar resolviendo el problema sin memoria dinámica ya que sí que conoces el número de ciudades y sus nombres de antemano (Solución 1 del otro tema pero más simplificada). Realmente no necesitas una estructura para guardar cada "arista" del grafo compuesta por: {origen/ciudad1, destino/ciudad2, distancia}. Lo que sí necesitas es una forma de poder relacionar una ciudad con un número (índice). Ahora te voy a dar una solución más sencilla que la anterior. No necesitas ni crear structs: Puedes crear un array de cadenas y guardar todas las ciudades. El índice de cada ciudad será ni más ni menos que la posición que tiene esa ciudad en el array. Código El orden en que definas aquí las ciudades es indiferente pero hará variar la posición de los elementos en la matriz (no sus valores). El orden que usé en la solución mostrada antes fue: [Corunya, Vigo, Valladolid, Bilbao, Madrid, Oviedo, Zaragoza, Barcelona, Gerona, Valencia, Badajoz, Jaen, Albacete, Murcia, Granada, Sevilla, Cadiz] Ahora teniendo los pasos anteriores, debes crearte la matriz de entrada (la que luego le pasarás a la función warshall() para que trabaje con ella) Esta matriz contendrá 1s y 0s por lo que debería ser de tipo int (bool también es aceptable pero no deja de ser lo mismo -> 1 = true | 0 = false) Código De momento utiliza memoria estática y cuando lo tengas funcionando puedes agregarle la memoria dinámica. Y ahora lo que queda es recorrer el fichero (no necesitas contar el número de filas) e ir buscando el índice correspondiente que tiene cada una de las ciudades. Una vez hayas encontado ambos índices, guardas un 1 en esa posición porque el 1 significa que puedes llegar desde la ciudad origen hasta la ciudad destino y si has encontrado ambas ciudades en una línea del fichero realmente te da igual la distancia, ya sabes que sí se puede llegar. Código
Para que el código anterior funcione correctamente te faltaría implementar las funciones: Código
A partir de aquí ya sería agregar algunas mejoras como:
Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 14 Mayo 2022, 18:01 pm Muchisimas gracias! ;-)
Lo voy probando en estos dias, a ver si lo consigo dejar correctamente hecho! Saludos! Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 18 Mayo 2022, 01:02 am Hola!,
he sacado un hueco para implementarlo, que voy a tope. Y me sale este resultado: 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Yo entiendo que todas las ciudades al final están conectadas unas con otras, no?. Osea desde Coruña puedes ir a Cadiz a través de las otras ciudades. Entonces no entiendo como la ultima fila da todo 0,s. Entiendo que la ultima fila es la de Cadiz en relación con las otras ciudades?. En ese caso llegando por Sevilla, hay conexión previa con las otras ciudades. No se si estaré entendiendo bien la interpretación del resultado :rolleyes: Ahora eso si, la funcion buscar indices no se si la tengo muy afinada, porque solo me ha corrido el programa, declarando punteros como paso de variables. Adjunto el codigo: Código
Muchas gracias de nuevo por la aclaración! Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 18 Mayo 2022, 01:50 am Hola de nuevo,
porque en lo que me piden en este ejercicio es comprobar que no existen ciudades aisladas o ciudades inalcanzables partiendo desde otra ciudad, y viendo a simple vista el fichero de texto, todas las ciudades estan conectadas. Entonces entiendo que deberia dar todo 1 el resultado del algoritmo no? Gracias de nuevo! Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: K-YreX en 18 Mayo 2022, 19:50 pm Hola de nuevo, El algoritmo de Warshall trabaja con grafos dirigidos. Es decir que una conexión: A->B no implica que haya una conexión: B->A.porque en lo que me piden en este ejercicio es comprobar que no existen ciudades aisladas o ciudades inalcanzables partiendo desde otra ciudad, y viendo a simple vista el fichero de texto, todas las ciudades estan conectadas. Entonces entiendo que deberia dar todo 1 el resultado del algoritmo no? Gracias de nuevo! En el fichero de texto te dan los datos para ir de la 'ciudad_origen' a la 'ciudad_destino' pero no puedes ir en dirección contraria. De ahí los resultados de tu matriz, que son correctos. A Cádiz sí puedes llegar desde algunas ciudades (última columna) pero desde Cádiz no puedes ir a ninguna (última fila). Para que pudieras ir desde Cádiz a otra ciudad tendrías que tener al menos una línea del fichero que empezara por Cádiz, y no es así. Por otro lado: Citar Código
No tienes un return por defecto por lo que la comprobación que haces en el main de si los índices son distintos de -1 no tiene sentido. Estas pequeñas cosas son las que hacen que se note que tu código es copiado... :silbar: :rolleyes: Título: Re: Ayuda con implementacion algoritmo warshall en C Publicado por: luar79 en 19 Mayo 2022, 00:57 am Ok! comprendido!, estaba pensando si era por eso, si era por que va en una dirección.
Ok muchas gracias por todo! |