0% encontró este documento útil (0 votos)
121 vistas5 páginas

Algoritmo de Java

Este documento describe un programa en Java que implementa el algoritmo de Dijkstra para resolver problemas de caminos mínimos en un grafo. El programa permite cargar un grafo desde teclado o archivo, determinar el nodo origen, y luego aplica el algoritmo de Dijkstra para encontrar los caminos mínimos desde el nodo origen hasta todos los demás nodos del grafo. Finalmente, imprime los resultados mostrando los caminos mínimos y sus costos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
121 vistas5 páginas

Algoritmo de Java

Este documento describe un programa en Java que implementa el algoritmo de Dijkstra para resolver problemas de caminos mínimos en un grafo. El programa permite cargar un grafo desde teclado o archivo, determinar el nodo origen, y luego aplica el algoritmo de Dijkstra para encontrar los caminos mínimos desde el nodo origen hasta todos los demás nodos del grafo. Finalmente, imprime los resultados mostrando los caminos mínimos y sus costos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

// fecha 2007, compilador: j2sdk1.5.

0_09
import java.io.*;
class principal{
public static void main(String args[]){
int num=0;
System.out.println("\n\tImplementacion del algoritmo de Dijkstra");
System.out.print("Numero de nodos que tiene el grafo a resolver? ");
do{
try{
InputStreamReader l1 = new InputStreamReader(System.in);
BufferedReader l2 = new BufferedReader(l1);
num=Integer.valueOf(l2.readLine()).intValue();
}
catch(IOException e){
System.out.println("Error: "+e);
System.out.println("Ingresa el numero de nodos que tiene el grafo
a resolver: ");
}
catch(NumberFormatException e2){
System.out.println("Error: "+e2);
System.out.println("Ingresa el numero de nodos que tiene el grafo
a resolver: ");
}
if(num<3 || num>26)
System.out.print(" * El numero de nodos debe estar entre 3 y 26
");

}
}

}while(num<3 || num>26);
dijkstra obj = new dijkstra(num);

// fecha 2007, compilador: j2sdk1.5.0_09


import java.io.*;
import java.util.*;
public class dijkstra{
int[][] matrizAdy;
int nNodos;
List conj_S = new ArrayList();
List conjComp_S = new ArrayList();
List caminos = new ArrayList();
String tmp;
InputStreamReader l1;
BufferedReader l2;
dijkstra(int numNodos){
matrizAdy = new int[numNodos][numNodos];
int aux=0;
l1 = new InputStreamReader(System.in);
l2 = new BufferedReader(l1);
nNodos=numNodos;
do{
System.out.println(" * Ingresa el numero de opcion para cargar el
grafo:\n1=Desde teclado\n2=Desde archivo");
System.out.println("(El archivo debe ser de texto simple y estar
formado por una matriz de nxn donde:");
System.out.println("n=numero de nodos y debe ser una matriz de
adyacencia con la siguientes caracteristicas:");
System.out.println("las aristas existentes se representaran por su
costo, las no existentes y lazos por -1)");
try{
aux=Integer.valueOf(l2.readLine()).intValue();
}
catch(IOException e0){
System.out.println("Error: "+e0);
aux=0;
}
catch(NumberFormatException e1){
System.out.println("Error: "+e1);
aux=0;
}
}while(aux<1 || aux>2);
if(aux==1)
cargaDesdeTeclado();
else
cargaDesdeArchivo();
do{
try{
System.out.print(" * Cual es el nodo origen: ");
aux=((int)((l2.readLine()).toUpperCase()).charAt(0))-65;
}
catch(IOException e2){
System.out.println("Error: "+e2);
aux=-1;
}
catch(StringIndexOutOfBoundsException e3){
System.out.println("Error: "+e3);

aux=-1;
}
}while(aux<0 || aux>nNodos-1);
matrizAdy[aux][aux]=0;
resuelve(aux);
}
private void cargaDesdeTeclado(){
boolean ocurrioError;
System.out.println(" * Ahora ingresa los datos que se te soliciten:
");
for(int cuenta=1;cuenta<=nNodos;cuenta++)
for(int cnt=1;cnt<=nNodos;cnt++){
if(cnt!=cuenta){
System.out.println("Costo de la arista dirigida del nodo "+
(char)(cuenta+64)+" al nodo "+(char)(cnt+64));
System.out.print("(Ingresa 0 si la arista no existe) ");
ocurrioError=false;
try{
matrizAdy[cuenta-1][cnt1]=Integer.valueOf(l2.readLine()).intValue();
ocurrioError=(matrizAdy[cuenta-1][cnt-1]<0?true:false);
matrizAdy[cuenta-1][cnt-1]=(matrizAdy[cuenta-1][cnt-1]==0?1:matrizAdy[cuenta-1][cnt-1]);
}
catch(IOException e0){
System.out.println("Error: "+e0);
ocurrioError=true;
}
catch(NumberFormatException e){
System.out.println("Error: "+e);
ocurrioError=true;
}
if(ocurrioError)
cnt--;
}
else
matrizAdy[cuenta-1][cuenta-1]=-1;
}
}
private void cargaDesdeArchivo(){
String nombAr;
String a;
StringTokenizer d;
int f=0;
int c=0;
System.out.println(" * Ingresa el nombre del archivo a leer: ");
try{
nombAr=l2.readLine();
FileReader ar = new FileReader(nombAr);
BufferedReader b = new BufferedReader(ar);
while((a=b.readLine())!=null){
d = new StringTokenizer(a);
c=0;
while(d.hasMoreTokens()){
matrizAdy[f][c++]=Integer.valueOf(d.nextToken()).intValue();

}
f++;

}
}
catch(FileNotFoundException e){
System.out.print("Error: "+e);
System.exit(0);
}
catch(IOException e1){
System.out.print("Error: "+e1);
System.exit(0);
}
catch(NumberFormatException e2){
System.out.print("Error: "+e2);
System.exit(0);
}

private void resuelve(int origen){


int nod;
int minimo;
int aux;
int nodCambio=0;
int intento;
String tmp2;
//Inicializando listas
for(int i=0;i<nNodos;i++){
if(i!=origen)
conjComp_S.add(""+i);
else
conj_S.add(""+i);
caminos.add("");
}
//Aplicando ciclo i de diksjtra
for(int i=0;i<nNodos;i++){
minimo=-1;
for(int j=0;j<conjComp_S.size();j++){
nod=Integer.valueOf((String)(conjComp_S.get(j))).intValue();
aux=min(nod);
if(minimo==-1 || (aux<minimo && aux!=-1)){
minimo=aux;
nodCambio=j;
}
}
if(minimo!=-1){
conj_S.add(""+(String)(conjComp_S.get(nodCambio)));
conjComp_S.remove(nodCambio);
}
}
//Imprimiendo resultados
System.out.print("\n -> Resultados <-");
for(int k=0;k<caminos.size();k++)
if(k!=origen){
tmp=(String)(caminos.get(k))+(char)(k+65);
caminos.set(k,tmp);
}
for(int j=0;j<caminos.size();j++)

if(j!=origen){
intento=0;
tmp=(String)(caminos.get(j));
while(tmp.charAt(0)!=(char)(origen+65) && intento<10){
aux=tmp.charAt(0)-65;
tmp=((String)(caminos.get(aux)))
+tmp.substring(1,tmp.length());
if(++intento==10)
tmp="*"+tmp;
};
imprimeCamino(tmp,j,origen);
}
System.out.println("\n <- Que tenga un buen viaje! ->\n");
}
private int min(int dest){
int min=-1;
int nod=0;
int nodOrig=-1;
int aux;
for(int i=0;i<conj_S.size();i++){
nod=Integer.valueOf((String)(conj_S.get(i))).intValue();
if(matrizAdy[nod][nod]!=-1 && matrizAdy[nod][dest]!=-1)
aux=matrizAdy[nod][nod]+matrizAdy[nod][dest];
else
aux=-1;
if((aux<min && aux!=-1)||min==-1){
min=aux;
nodOrig=nod;
}
}
if(min!=-1){
matrizAdy[dest][dest]=min;
caminos.set(dest,""+(char)(nodOrig+65));
}
return min;
}
private void imprimeCamino(String cam, int nod, int o){
System.out.print("\nCamino: ");
if(cam.charAt(0)=='*')
System.out.print("Te jodes: no hay camino de: "+(char)(o+65)+" a:
"+cam.charAt(cam.length()-1)+"!!");
else{
for(int i=0;i<cam.length();i++)
System.out.print(""+cam.charAt(i)+(i==cam.length()-1?"":"->"));
System.out.print(" costo: "+matrizAdy[nod][nod]);
}
}
}

También podría gustarte