with Ada.Text_IO;
use Ada.Text_IO;
procedure Caminos is
type Nodo is range 1 .. 50;
type Ancho_Banda is new Integer;
subtype Num_Nodos is Nodo range 1 .. 50;
type Lista_Adyacencia is array (Nodo) of Ada.Containers.Vectors.Vector (1 .. Num_Nodos);
type Matriz_Adjacencia is array (Nodo, Nodo) of Ancho_Banda;
procedure Leer_Datos (F : in File_Type; Num_Nodos : out Num_Nodos; Lista : out Lista_Adyacencia; Matriz : out Matriz_Adjacencia);
procedure Calcular_Caminos (Origen, Destino : in Nodo; Lista : in Lista_Adyacencia; Matriz : in Matriz_Adjacencia; Caminos : out Integer);
F : File_Type;
Num_Nodos : Num_Nodos;
Lista : Lista_Adyacencia;
Matriz : Matriz_Adjacencia;
Origen, Destino : Nodo;
Num_Caminos : Integer;
begin
-- Abrir el fichero de datos
Open (F, In_File, "ruta_del_fichero");
-- Leer los datos del fichero
Leer_Datos (F, Num_Nodos, Lista, Matriz);
-- Cerrar el fichero
Close (F);
-- Obtener los nodos de origen y destino
Put ("Ingrese el nodo de origen: ");
Get (Origen);
Put ("Ingrese el nodo de destino: ");
Get (Destino);
-- Calcular el número de caminos entre los nodos
Calcular_Caminos (Origen, Destino, Lista, Matriz, Num_Caminos);
-- Mostrar el resultado
Put ("El número de caminos entre los nodos ");
Put (Origen);
Put (" y ");
Put (Destino);
Put (" es: ");
Put (Num_Caminos);
New_Line;
exception
when others =>
Put_Line ("Ocurrió un error al procesar el archivo.");
end Caminos;
procedure Leer_Datos (F : in File_Type; Num_Nodos : out Num_Nodos; Lista : out Lista_Adyacencia; Matriz : out Matriz_Adjacencia) is
Nodo_Origen, Nodo_Destino : Nodo;
Ancho : Ancho_Banda;
begin
-- Leer el número de nodos
Get (F, Num_Nodos);
Skip_Line (F);
-- Inicializar la lista de adyacencia y matriz de adyacencia
for I in Num_Nodos loop
Lista (I) := Ada.Containers.Vectors.Empty_Vector (1 .. Num_Nodos);
for J in Num_Nodos loop
Matriz (I, J) := 0;
end loop;
end loop;
-- Leer los datos de las conexiones
while not End_Of_File (F) loop
Get (F, Nodo_Origen);
Get (F, Nodo_Destino);
Get (F, Ancho);
Skip_Line (F);
Lista (Nodo_Origen).Append (Nodo_Dest
ino);
Matriz (Nodo_Origen, Nodo_Destino) := Ancho;
end loop;
end Leer_Datos;
procedure Calcular_Caminos (Origen, Destino : in Nodo; Lista : in Lista_Adyacencia; Matriz : in Matriz_Adjacencia; Caminos : out Integer) is
function Contar_Caminos (Nodo_Actual : Nodo) return Integer is
Resultado : Integer := 0;
begin
if Nodo_Actual = Destino then
return 1;
else
for I in Lista (Nodo_Actual)'Range' loop
Resultado := Resultado + Contar_Caminos (Lista (Nodo_Actual)(I));
end loop;
return Resultado;
end if;
end Contar_Caminos;
begin
Caminos := Contar_Caminos (Origen);
end Calcular_Caminos;
begin
Caminos;
end;