Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con Grafo.

Estas en el tema de Problema con Grafo. en el foro de Java en Foros del Web. Hola. Estoy desarrollando un código que encuentre el camino mas corto de un punto a otro en una matriz de peso, ya tengo el programa ...
  #1 (permalink)  
Antiguo 11/04/2010, 22:48
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 11 meses
Puntos: 1
Problema con Grafo.

Hola.

Estoy desarrollando un código que encuentre el camino mas corto de un punto a otro en una matriz de peso, ya tengo el programa sólo que es de una matriz de adyacencia, la diferencia radica que en el de adyacencia al 'avanzar' siempre el valor es 1, y en una matriz de peso, hay distancias, puede ser que de 'a' a 'b' sea 10, y de 'b' a 'c' sea 5 por ejemplo. El código como pueden ver ya está terminado, sólo me gustaría que me hecharan una mano para modificar eso, o alguna idea no vendría nada mal.

Código Java:
Ver original
  1. import java.io.*;
  2. //Declaración de la clase
  3. public class Prim
  4. {
  5.     public static void main( String []args ) throws Exception
  6.     {
  7.         int n,inicio,termino;
  8.         int [][]matriz;
  9.         BufferedReader lectura;
  10.         lectura = new BufferedReader(new InputStreamReader( System.in ) );
  11.         // Se pide el orden de la matriz de adyacencia.
  12.         System.out.print("Ingrese el orden de la matriz de adyacencia : ");
  13.         n = Integer.parseInt(lectura.readLine());
  14.         // Se genera la matriz..
  15.         matriz = new int[n][n];
  16.         System.out.println();
  17.         // Se piden los datos para la matriz.
  18.         for(int i=0;i<n;i++)
  19.             for(int j=0;j<n;j++)
  20.             {
  21.                 System.out.print("Ingrese elemento ("+i+","+j+") : ");
  22.                 matriz[i][j] = Integer.parseInt(lectura.readLine());
  23.             }
  24.         System.out.println("\n\nMatriz de Adyacencia : \n");
  25.         // Se pide indefinidamente nodos para ver su factibilidad.
  26.         // El ciclo sale con
  27.         do
  28.         {
  29.             // Se muestra la matriz.
  30.             for(int i=0;i<n;i++)
  31.             {
  32.                 for(int j=0;j<n;j++)
  33.                 {
  34.                     System.out.print(" "+matriz[i][j]);
  35.                 }
  36.                 System.out.println();
  37.             }
  38.             System.out.println();
  39.             // Se piden los nodos a analizar.
  40.             System.out.print("Ingrese Nodo de Inicio  : ");
  41.             inicio = Integer.parseInt(lectura.readLine());
  42.             System.out.print("Ingrese Nodo de Término : ");
  43.             termino = Integer.parseInt(lectura.readLine());
  44.             System.out.println();
  45.             // Se verifica que los indices sean mayores o iguales a 0.
  46.             if((inicio >= 0)&&(termino>=0))
  47.                 encontrarCaminoMasCorto(matriz,inicio,termino);
  48.         } while((inicio!=-1)&&(termino!=-1));
  49.     }
  50.     // Método que encuentra el camino mas corto entre 2
  51.     // vértices del grafo.
  52.     public static void encontrarCaminoMasCorto(int [][]m,int ini,int fin)
  53.     {
  54.         // Se verifica que no se este tratando de accesar a un vértice
  55.         // fuera del rango de la matriz de adyacencia.
  56.         if((ini>m.length-1)||(fin>m[0].length))
  57.         {
  58.             System.out.print("Indices fuera de rango...");
  59.             return;
  60.         }
  61.         // Se quiere ver el camino más corto desde un nodo a sí mismo
  62.         // entonces se imprime el coste de llegar a sí mismo.
  63.         if( ini == fin )
  64.         {
  65.             System.out.println("\t\t Costo de llegar de "+ini+" a "+fin+" es de "+m[ini][fin]);
  66.             System.out.println("\n");
  67.             return;
  68.         }
  69.         // Como los indices están bien ingresados y no se está
  70.         // tratando con el caso base de que se quiera llegar al mismo nodo
  71.         // entonces se busca la distancia más corta que hay entre el nodo "ini"
  72.         // y el nodo "fin".
  73.         System.out.println("\n\t\t Costo de llegar de "+ini+" a "+fin+" es de "+MostrarCaminoMasCorto(ini,fin,ini,0,m));
  74.         System.out.println("\n");
  75.     }
  76.     // Método que muestra el camino más corto entre dos vértices del grafo.
  77.     public static int MostrarCaminoMasCorto(int ini,int ter,int x,int suma,int [][]matriz)
  78.     {
  79.         int i,j,garage;
  80.         // Si se pasarón los límites de orden de la matriz entonces
  81.         // quiere decir que el camino no se encuentra y se retorna 0.
  82.         if(x>(matriz.length-1))
  83.         {
  84.             System.out.print("El camino entre los nodos no existe...");
  85.             System.out.println("\n");
  86.             return -1;
  87.         }
  88.         // Como se esta todavía dentro de la matriz entonces se
  89.         // sigue buscando un nodo que llegue al nodo terminal.
  90.         for(i=0;i<matriz[0].length;i++)
  91.         {
  92.             // Existe una llegada al nodo deseado entonces
  93.             // Se suma el costo al costo general y se retorna la suma.
  94.             if(matriz[x][ter]!=0)
  95.             {
  96.                 System.out.println("Revisando Nodo "+x+" - Costo : "+suma);
  97.                 suma += matriz[x][ter];
  98.                 break;
  99.             }
  100.             else
  101.                 // Como lo anterior no pasó entonces se verifica que
  102.                 // existe un camino para pasar al próximo nivel.
  103.                 if(matriz[x][i]!=0)     // Camino existe
  104.                 {
  105.                     System.out.println("Revisando Nodo "+x+" - Costo : "+suma);
  106.                     garage = suma;
  107.                     suma += MostrarCaminoMasCorto(ini,ter,x+1,suma,matriz);
  108.                     if(suma==-1)
  109.                         suma = garage;
  110.                     else
  111.                         if((suma>garage)&&(garage!=0))
  112.                             suma=garage;
  113.                 }
  114.         }
  115.  
  116.         return suma;
  117.     }
  118. }// Fin de la clase

De antemano, muchas gracias.

Saludos.

Última edición por Gaug; 12/04/2010 a las 00:01

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:29.