Sie sind auf Seite 1von 9

TALLER EXPLICATIVO COMO APOYO DE LA ASIGNATURA DE PROGRAMACIN IV (PROF: CARLOS HENRQUEZ)

1. TEMA Grafos y caminos Mnimos 2. OBJETIVOS Proporcionar una introduccin a los grafos, vistos como estructuras de datos, ilustrando las distintas representaciones y diferentes aplicaciones. 3. CONCEPTUALIZACIN Los grafos son un concepto matemtico muy importante, el cual tiene muchas aplicaciones no solo en informtica, sino tambin en otros campos como por ejemplo, en el transporte (representando redes de carreteras), en ingeniera elctrica (representando circuitos), etc. Un grafo es una estructura de datos utilizada para representar una coleccin de elementos, caracterizada porque cada objeto puede tener cero, uno o muchos objetos antecesores y sucesores en la coleccin. Existen dos teoras de grafos paralelas, la de grafos dirigidos y la de grafos no dirigidos. Un grafo dirigido o digrafo G se define como un par (V, A) donde V es un conjunto de elementos, y A es una relacin binaria definida sobre V. Los elementos de V se denominan nodos o vrtices, y los elementos de A arcos. Dado un arco (x,y) de A, se dice que x es el origen e y el destino del arco. Ejemplo: V= { v1, v2, v3, v4} A= {(v1,v2), (v2,v1), (v3,v2), (v3,v3) } Si el par (x,y) no fuera considerado ordenado el grafo sera un grafo no dirigido. En este ltimo caso el par (x,y) es igual al par (y,x). Si G es un grafo no dirigido los elementos de A se denominan aristas. IMPLEMENTACIN. Tenemos dos maneras de implementar las aristas de un grafo. Si consideramos que los nodos de un grafo se puede representar por un conjunto de la forma V={1, 2, 3,..., n}, las aristas las podemos representar de los modos siguientes:

a) Matriz de costes, o matriz de adyacencia. Se utiliza una matriz M de n filas y n columnas donde cada entrada M(i, j) es el coste de la arista que parte de i hasta j. Si no hay arista entre i y j entonces M(i, j) = . De esta forma, el acceso a cada arista tiene coste constante, (1). Para buscar los vrtices adyacentes, tanto sucesores o predecesores, consiste en recorrer una fila o una columna, por tanto tendr coste lineal, (n). Si el grafo es denso, habr muchas aristas, entonces la matriz anterior tendr pocos infinitos y es una buena representacin. b) Lista de adyacencia. Utilizamos un vector g[1..n] en los que cada g(i) es una lista de los sucesores de i. Para buscar los sucesores de i tan solo hay que recorrer la lista g(i), coste lineal, (n). Para buscar una arista tambin basta con recorrer la lista, coste lineal, (n). CAMINOS DE COSTE MNIMO. Partimos de un grafo dirigido dado por su matriz de adyacencia. G(i, j) = c Si hay una arista de i a j con coste c y ij. G(i, j) = Si no hay tal arista y ij. G(i, i) = 0. Tenemos que calcular el camino con coste mnimo para ir de i a j. Si la solucin es entonces no hay camino posible entre i y j. En primer lugar veamos la idea en la que se basa el algoritmo. Vamos a denotar como R(i, j) = {i, x1, x2, ..., xh, j} a un camino que nos lleva de i a j. Si el camino mnimo que lleva de i a j pasa por k y es R(i, j) = R(i, k) ++ R(k, j) entonces los caminos R(i, k) y R(k, j), que llevan de i a k y de k a j tambin son mnimos. De no ser as sera porque hay dos caminos R(i, k) y R(k, j) que nos lleva de i a k y de k a j cuyo coste es menor que los originales. Entonces el coste de R(i, j) es mayor que la suma de ambos costes y por tanto mayor, R(i, j) no podra ser el camino de coste mnimo. Algoritmo de Floyd. Proc floyd(G[1..n, 1..n], C[1..n, 1..n] , P[1..n, 1..n]); C:=G; Para m=1 hasta n hacer Para r=1 hasta n hacer P[m,r]:=m; Para k=1 hasta n hacer Para i=1 hasta n hacer Para j=1 hasta n hacer Si C(i, k)+C(k, j) < C(i, j) entonces C(i, j) = C(i, k) + C(k, j) P(i, j) = k Fsi;

Fpara; Fpara; Fpara; Fproc; La matriz P es la que se utiliza para conocer el camino concreto. Para hacerlo se acta as, si queremos conocer el camino mnimo entre i y j, calculamos las matrices C y P por el algoritmo anterior, a continuacin tomamos P(i, j) = k. Esto significa que el camino mnimo que lleva de i a j pasa por k. Necesitamos conocer el camino mnimo de i a k y de k a j, pero como ya hemos calculado las matrices C y P, consultamos P(i, k) = r y P(k, j) =s. A continuacin consultamos P(i, r), P(r, k), P(k, s) y P(s, j) Procedimiento camino(int i, int j) k=P[i][j]; si k==0 return; camino(i,k); escribir k; camino(k,j); Fin Procedimiento
4. TALLER EXPLICATIVO import java.util.*; public interface Grafo { // Constructoras //Modificadoras void insVertice(int dato); void insArco(int o, int d,int dato); void elimArco(int o, int d); //Analizadoras int costoArco(int x, int y); LinkedList<Integer> sucesores(int v); int infoVertice(int v); int ordenGrafo(); String mostrar (); int inf=9999999; } import java.util.*; public class GrafoM implements Grafo { int mat[][]; LinkedList<Integer> ver ; int n,nv=0;

/** Creates a new instance of GrafoM */ public GrafoM() { mat=new int[1000][1000]; ver=new LinkedList<Integer>(); for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) { if(i!=j) { mat[i][j]=inf; } } } //Modificadoras public void insVertice(int dato){ ver.add(dato); } public void insArco(int o, int d,int dato) { mat[o][d]=dato; } public void elimArco(int o, int d){ mat[o][d]=inf; } public int costoArco(int x, int y) { return mat[x][y]; } public LinkedList<Integer> sucesores(int v) { LinkedList<Integer> lista=new LinkedList<Integer>(); for(int j=0;j<ver.size();j++) { if(mat[v][j]!=inf && j!=v) lista.add(j); } return lista; }

public int infoVertice(int v){ return ver.get(v); } public int ordenGrafo() { return ver.size(); } public String mostrar() { String aux=" GRAFO \n"; for(int i=0;i<n;i++) { aux+=" "+ver.get(i)+" ==>"; for(int j=0;j<n;j++) { if(mat[i][j]==inf) aux+=" "+"999999"; else aux+=" "+mat[i][j]; } aux+="\n"; } return aux; } } public class Floyd { private int n; private int l[][];//adya private int d[][];//solucion private int recor[][]; private static String ruta=""; public int[][] solucion(Grafo g) { n=g.ordenGrafo(); l=matriz(g); d=copiar(l); recor=new int[n][n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) recor[i][j]=-1; camino();

return d; } public int[][]copiar(int l[][]) { int res[][]=new int[n][n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) res[i][j]=l[i][j]; return res; } public int[][]matriz(Grafo g) { l=new int[n][n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { l[i][j]=g.costoArco(i,j); } } return l; }

public int minimo(int x, int y) { int min=0; if(x<y) min=x; else min=y; return min; } public String recorrido(int i, int j) { int k=recor[i][j]; if( k==-1) return ""; recorrido(i,k); ruta+=" "+k; recorrido(k,j); return ruta;

} public static String getRuta() { return ruta; } public void camino() { for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { if(d[i][j]>d[i][k]+d[k][j]) recor[i][j]=k; d[i][j]=minimo(d[i][j],d[i][k]+d[k][j]); } } } }

public void resultado() { System.out.println("Camino mas corto entre todos los vertices"); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ System.out.print(d[i][j]+" "); } System.out.println("\n"); } } public void mostrar() { System.out.println(" Matriz Adyacencia etiquetada"); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ System.out.print(l[i][j]+" "); } System.out.println("\n"); } }

} import java.util.*; public class PruebaFloyd { public static void main(String[] args) { // TODO code application logic here Grafo ob=new GrafoM(); iniciar(ob); // Prueba de Floyd Floyd f=new Floyd(); int sol[][]=f.solucion(ob); System.out.println(ob.mostrar()); System.out.println(" Matriz solucion floyd"); for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ System.out.print(" "+sol[i][j]); } System.out.println(""); } System.out.println(" ruta de 0-3 es \n 0 "+f.recorrido(0,3)+" 3");

} public static void iniciar(Grafo ob) { int inf=9999; for(int i=0;i<5;i++) ob.insVertice(i); ob.insArco(0,1,4); ob.insArco(0,2,11); ob.insArco(0,3,inf); ob.insArco(0,4,inf);

ob.insArco(1,0,inf); ob.insArco(1,2,inf); ob.insArco(1,3,6); ob.insArco(1,4,2); ob.insArco(2,0,inf); ob.insArco(2,1,3); ob.insArco(2,3,6); ob.insArco(2,4,inf); ob.insArco(3,0,inf); ob.insArco(3,1,inf); ob.insArco(3,2,inf); ob.insArco(3,4,inf); ob.insArco(4,0,inf); ob.insArco(4,2,5); ob.insArco(4,3,3); ob.insArco(4,1,inf);

} } 5. TALLER Dado dos vrtices hallar el costo mnimo Modifique el programa para manejar por cada vrtice un nombre de ciudad. Dado un vrtice aislarlo del grafo y calcular otra vez costo mnimo

Das könnte Ihnen auch gefallen