10/11/2014Implementación del Algoritmo de Kruskal en Java - Wikilibros Implementación del Algoritmo de Kruskal en Java De Wikilibros, la colección de libros de texto de contenido libre. El algoritmo de Kruskal es un algoritmo de la teoría de grafos que busca encontrar un árbol recubridor mínimo de un grafo dado. Aquí encontraremos una implementación en Java incluyendo una interfaz gráfica. Contenido 1 Descripción del Problema 2 Limitaciones 3 Solución 3.1 Estructura Grafo 3.1.1 Clase Enlace 3.1.2 Clase Nodo 3.1.3 Clase Arco 3.1.4 Clase Grafo 3.2 Interfaz Gráfica 3.2.1 Clase Lienzo 3.2.2 Clase Punto 3.2.3 Clase Arista 3.3 Paquete Principal 3.3.1 Clase AlgoritmoKruskal 3.4 VENTANA 3.4.1 Clase Aplicación 4 Modo de compilación y ejecución 5 Pruebas 6 Tiempo empleado 7 Tiempo de Ejecución T(n) 8 Conclusiones 9 Véase también 10 Enlaces externos Descripción del Problema El algoritmo de kruskal, es un algoritmo voraz utilizado en la teoría de grafos, con el fin de encontrar un árbol recubridor mínimo de un grafo conexo y ponderado. El algoritmo de kruskal consiste en: Paso 0: Iniciar el árbol T con n nodos y sin arcos T=({1, 2, …n},ø) http://es.wikibooks.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 1/22 10/11/2014 Implementación del Algoritmo de Kruskal en Java - Wikilibros Paso 1: Con los arcos de G crear una lista L de arcos, en orden ascendente de peso. Los arcos con el mismo peso son ordenados arbitrariamente. Paso 2. Seleccionar el arco (i,j) que esté al comienzo de L. Si éste forma un circuito en T no se transfiere a T y se borra de L y se repite el paso 2. Si no forma circuito en T se transfiere a T y se borra de L. Paso 3. Si L es no vacío, volver al paso 2, de lo contrario PARAR. Limitaciones Las únicas limitaciones que se presentan con el problema de la implementación del algoritmo de Kruskal es la creación de un algoritmo adicional que nos compruebe que al adicionar una arista al grafo no nos haga un ciclo. El algoritmo implementado es el siguiente: public boolean HayCiclo(Grafo g,Arco aVerificar,Nodo terminal,String N) { ArrayList<Enlace> aux=terminal.getEnlaces(); if(aux.size()==0) return false; if(terminal.existeEnlace(aVerificar.getInicial())!=-1) return true; for(int i=0;i<aux.size();i++) { Enlace nodo=aux.get(i); } } if(nodo.getDestino().equals(N)==false) if( HayCiclo(g,aVerificar,g.getNodo(nodo.getDestino()),terminal.getNombre())) return true; return false; Solución En la implementación del algoritmo de Kruskal en Java, se hizo uso de una estructura de datos adicional llamada grafo y adicionalmente se implementó una interfaz gráfica. Estructura Grafo Clase Enlace // creamos un clase llamada enlace La clase enlace se utiliza para hacer refencia al nodo terminal y al peso de un arco. http://es.wikibooks.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 2/22 wikibooks. } public String getDestino() { return destino. import javax.ArrayList. } } public double getPeso() { return peso. enlacesExistentes = -1. private int enlacesExistentes. public ArrayList<Enlace> getEnlaces() { return enlaces. } Clase Nodo Hace referencia a un nodo del grafo. public class Nodo { private String nombre. } public Nodo(String newName) { nombre = newName.util.JOptionPane. enlaces = new ArrayList<Enlace>().org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 3/22 . } public void modificar(double peso1) { peso = peso1. } public int getEnlacesExistentes() { return enlacesExistentes.10/11/2014 Implementación del Algoritmo de Kruskal en Java . public Enlace(String desti. } public String getNombre() { http://es.swing.Wikilibros public class Enlace { private String destino. private double peso. double peso1) { destino = desti. peso = peso1. guardando un nombre y una serie de enlaces a otros nodos. peso = -1. } public Enlace(String desti) { destino = desti. import java. private ArrayList<Enlace> enlaces. i < enlaces. return miEnlace.peso)).getDestino(). } } boolean eliminarEnlace(int posicion) { if (posicion >= 0 && posicion <= enlaces.add(new Enlace(enlazar.equals(enlazar)) return i.get(posi). } else { int posicion.getPeso(). posicion = existeEnlace(enlazar). public class Arco { http://es. enlacesExistentes--. nodo terminal y peso de un determinado arco del grafo.showMessageDialog(null. if (posicion == -1) { enlaces. } } } public int existeEnlace(String enlazar) { for (int i = 0.10/11/2014 Implementación del Algoritmo de Kruskal en Java . miEnlace = enlaces. } Clase Arco Guarda la referencia del nodo inicial.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 4/22 . enlacesExistentes++. } else JOptionPane.peso)). return true. } public double enlacePosicion(int posi) { Enlace miEnlace. miEnlace = enlaces. } return -1.size()) { enlaces.getDestino(). } public String NodoPosicion(int posi) { Enlace miEnlace.add(new Enlace(enlazar. } public void agregarEnlace(String enlazar. miEnlace = enlaces. "No hay enlace en la posicion " + posicion).remove(posicion).Wikilibros return nombre.size(). return miEnlace. i++) { Enlace miEnlace.get(posi).get(i). return false.double peso) { if (enlacesExistentes == -1) { enlaces. if (miEnlace. enlacesExistentes++.wikibooks. private String terminal. " + peso + ")".10/11/2014 Implementación del Algoritmo de Kruskal en Java . ArrayList <Arco>aristas. public Grafo() { nombres=new ArrayList<String>().Nodo> nodos. } public void setInicial(String inicial) { this. } public void setPeso(float peso) { this. String ter. aristas=new ArrayList <Arco>().util.terminal = terminal.Nodo>().inicial = inicial.Hashtable. } public float getPeso() { return peso. nodos=new Hashtable <String.ArrayList. float pes) { inicial = ini. import java. public Arco(String ini. import java.Wikilibros private String inicial. Hashtable <String. terminal = ter. " + terminal + ".util. compuesta por nodos y arcos.peso = peso. peso = pes. } public void ingresarNodo(String nombre) http://es. } } public String toString() { return "(" + inicial + ". } public void setTerminal(String terminal) { this.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 5/22 . public class Grafo { ArrayList <String>nombres.wikibooks. } Clase Grafo Representa la estructura grafo. } public String getInicial() { return inicial. } public String getTerminal() { return terminal. private float peso. remove(otro).get(nombre). if(i==-1) aristas.wikibooks. } public Nodo getNodo(String nombre) { return (Nodo)nodos.aristas = aristas.i<aristas. return true.peso). } public void setNombres(ArrayList<String> nombres) { this.getInicial())&&arco.i++) { if(peso<aristas. } public void adicionarEnlace(String nodoInicial. } public boolean busarArista(Arco arco) { for(int i=0.equals(otro.get(nodoTerminal).nodoTerminal.i<aristas. } return -1.getTerminal().nuevo).i++) { Arco otro=aristas. else aristas. } public int buscarIndice(float peso) { for(int i=0.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 6/22 .getInicial().getTerminal())&& { aristas.getPeso()) return i.get(i). } } Interfaz Gráfica http://es. int i=buscarIndice(nuevo.add(nuevo). nodos. nodos.peso). nodos.add(nombre).agregarEnlace(nodoTerminal.Wikilibros { nombres.put(nombre. } } return false. } public ArrayList<String> getNombres() { return nombres. if(arco.new Nodo(nombre)). } public void setNodos(Hashtable<String.peso). } public ArrayList<Arco> getAristas() { return aristas.String nodoTerminal. } public Hashtable getNodos() { return nodos. } public void setAristas(ArrayList<Arco> aristas) { this.float peso) { Arco nuevo=new Arco(nodoInicial.agregarEnlace(nodoInicial.nombres = nombres.Nodo > muchos) { nodos=muchos.size().equals(otro.size().add(i.10/11/2014 Implementación del Algoritmo de Kruskal en Java .get(i).get(nodoInicial).getPeso()). util. import javax.get(i). arista.get(i). public boolean estado = false. public class Lienzo extends JComponent { private ArrayList<Punto> puntos. i++) { final Arco n = aristas.RED).getX() + 5. i < aristas. arista.size(). public Lienzo() { aristas = new ArrayList<Arista>().get(i). nuevo.JComponent. for (int i = 0.drawLine((int) a. private Point a.pintarRecta(g).awt.getArista().getX() + 5. (int) b. import java. arista.swing.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 7/22 . punto.BLUE).ArrayList.get(i). i++) { final Arista arista = (Arista) aristas. i++) { aux = aristas.getArista(). http://es. } public void paintComponent(Graphics g) { if (punto) { g. } if (estado) for (int i = 0.pintarRecta(g).getY() + 5.add(aristas.Wikilibros Clase Lienzo Es el lienzo sobre el cual se dibujará el grafo. } estado = true.size(). (int) a.size(). i++) { final Punto punto = (Punto) puntos. private ArrayList<Arista> aristas.get(i)).size(). } for (int i = 0. private ArrayList<Arista> neo. (int) b.add(n). neo = new ArrayList<Arista>(). i < neo. public boolean punto = false.10/11/2014 Implementación del Algoritmo de Kruskal en Java . } for (int i = 0. i < aristas.setColor(Color. i < puntos.wikibooks. i++) { final Arista arista = (Arista) neo.busarArista(aux) == true) neo. } if (nuevo. import java.size().pintarPunto(g).get(i).getAristas(). i < aristas. puntos = new ArrayList<Punto>(). b.*. g. } } public void cambiarGrafo(Grafo nuevo) { Arco aux. for (int i = 0.getY() + 5).setColor(Color. import java.Color. public class Punto { private Point ubicacion.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 8/22 . } public void setPuntos(final ArrayList<Punto> puntos) { this.setColor(Color. private String nombre. this. } public void setAristas(final ArrayList<Arista> aristas) { this. String nombre) { ubicacion = new Point(x. } public ArrayList<Arista> getNeo() { return neo.Wikilibros } repaint(). import java. } Clase Punto Permite dibujar un punto sobre el lienzo.neo = neo.awt. Hace referencia a la posición del punto sobre el lienzo.BLACK). http://es. import java.Graphics. private static final int RADIO = 10. y). } public void setNeo(final ArrayList<Arista> neo) { this.BLUE. } public ArrayList<Arista> getAristas() { return aristas.aristas = aristas. } public void pintarPunto(Graphics g) { g. private Color colorPunto = Color.b = b.wikibooks.awt.nombre = nombre. } public void setA(Point a) { this. public ArrayList<Punto> getPuntos() { return puntos. } } public void setB(Point b) { this.a = a. public Punto(int x.awt.10/11/2014 Implementación del Algoritmo de Kruskal en Java . int y.puntos = puntos.Point. 10. ubicacion.drawString(nombre.fillOval(ubicacion. float peso) { http://es. Hace referencia a los puntos.3). } } Clase Arista Permite dibujar una arista entre dos puntos sobre el lienzo.Graphics. } public boolean ecuacionDeCirculo(Point punto) { return (((punto.awt.Color. private Point inicial.x .setColor(colorPunto).colorPunto = colorPunto.x . g.y . g. java.Graphics2D.3). private Punto a. java.y . } public String getNombre() { return nombre. Punto puntoB. import import import import import java. public Arista(Punto puntoA.awt.awt.3. ubicacion.RED.Wikilibros } g.awt. ubicacion. aux = Color.geom.x. int tipo.BLACK).10/11/2014 Implementación del Algoritmo de Kruskal en Java .Point. private Color color = new Color(0.y. 10.x. private Point terminal. ubicacion. public class Arista { private Arco arista.ubicacion. b.y .ubicacion = ubicacion.wikibooks.x) * (punto.x . java.ubicacion. ubicacion.ubicacion. } public void setColorPunto(Color colorPunto) { this. public void pintarPunto(Graphics g. 10). 128. Color color) { g.x) + (punto.y) * (punto. g. ubicacionExt.awt.x . } public void setUbicacion(Point ubicacion) { this.3. } public Color getColorPunto() { return colorPunto. 10).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 9/22 . ubicacion.drawString(nombre. java. private float peso. 128).y. g.y . private int tipo.setColor(color).ubicacion.QuadCurve2D.setColor(Color.fillOval(ubicacion. g. } public Point getUbicacion() { return ubicacion. control.y + terminal. g. inicial.Double().30. QuadCurve2D.y + 5).setColor(aux).drawString(peso + "". } a = puntoA. + terminal. + terminal. double m = a / b. + terminal. g.terminal. inicial. quad.30. g. b = puntoB. terminal. tempFinal). if (grado > 0) { if (grado <= 45 && grado >= 0) control = new Point((inicial. control. this.setColor(color). 30). g.getUbicacion(). (inicial.getUbicacion(). double b = (inicial. break.peso = peso. peso).y). terminal.10.setColor(color). puntoB.draw(quad). (inicial. g.x) / 2.x if (grado <= 90 && grado > 45) control = new Point((inicial.setCurve(tempInicial.y + 5).x) / 2 . } } public Point getUbicacion() { return ubicacionExt.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 10/22 .x } + terminal.setColor(aux).drawString(peso + "". g.tipo = tipo. (inicial. terminal.terminal. g. public void pintarRecta(Graphics ga) { inicial = a.setColor(color).x .y + 5).x .drawOval(inicial.x. g. control.drawString(peso + "". terminal = b. g. (inicial.getNombre().x } else { if (grado >= -45 && grado <= 0) control = new Point((inicial.50.x + 5. double a = (inicial.wikibooks.x . (inicial.y + terminal.getNombre().x) / 2 + 50. 30. inicial. inicial. inicial. } public int getTipo() { http://es.atan(m).y). tempFinal = new Point(terminal.y .y .10/11/2014 Implementación del Algoritmo de Kruskal en Java .Wikilibros arista = new Arco(puntoA.x if (grado >= -90 && grado < -45) control = new Point((inicial.setColor(aux). double grado = Math.x).y + terminal.30). (inicial.y + terminal.x + 5.Double quad = new QuadCurve2D. g.x) / 2 .x + terminal. g.drawLine(inicial. break.y + terminal. Point control = null.10. Graphics2D g = (Graphics2D) ga. Point tempInicial = new Point(inicial. this.3. switch (tipo) { case 0: case 1: case 2: g.y) / 2).y .x + 5. break.x) / 2 .x + 5.y + 5. } ArrayList<Arco> L=(ArrayList<Arco>)grafo.getNombres(). else aux = Color. ArrayList<String> nodos=grafo. pro. } public void setArista(Arco arista) { this. Arco pro=L. pro. pro.color = color.get(j)).size()!=0) { pro=L.ingresarNodo(nodos. public Arco getArista() { return arista.árbol.getInicial(). 128.remove(pro). } public void getColor() { color = new Color(0. if(HayCiclo(árbol.getPeso()).clone().getTerminal().getTerminal()) . L. while(L.util.RED. Paquete Principal Clase AlgoritmoKruskal //Implementación del Algoritmo voraz de Kruskal.wikibooks.getTerminal(). for(int j=0. pro. árbol. aux = Color.getNodo(pro.get(0).adicionarEnlace(pro. pro. public class AlgoritmoKruskal { @SuppressWarnings("unchecked") public Grafo aplicarKruskal(Grafo grafo) { Grafo árbol=new Grafo(). 128).BLUE.getInicial().getTerminal())==false) árbol. import java.get(0).arista = arista.equals(new Color(0.RED.getPeso()). } public void setColor(Color color) { if (color. } } this. 128.Wikilibros } return tipo.getAristas(). pro.j<nodos.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 11/22 .j++) { árbol. http://es. 128))) aux = Color.size().adicionarEnlace(pro.10/11/2014 Implementación del Algoritmo de Kruskal en Java .ArrayList. awt.event.ItemListener.swing. javax. return árbol.awt.nuevo.i<aux.size()==0) return false.Wikilibros } } L.JRadioButton. } } } if(nodo. javax.swing.JButton. for(int i=0. javax. ArrayList<Punto> puntos. javax.event.10/11/2014 Implementación del Algoritmo de Kruskal en Java .BorderFactory.ItemEvent.awt.awt. java. radioMod.swing.equals(N)==false) if( HayCiclo(g.swing.event. javax. java.awt.get(i).awt.swing. MouseMotionListener { int cantidad = 0.Point.swing.event.ActionListener. import import import import import import import import import import import import java. ActionListener.Font.swing. java.recuperar.event.getEnlaces().Container.MouseMotionListener.swing.getNombre())) return true.util.swing. JRadioButton radioNodo.Arco aVerificar.MouseListener. ArrayList<Arista> aristas.awt.ArrayList.Nodo terminal.terminal.event. radioArista. java.aVerificar.MouseEvent. public boolean HayCiclo(Grafo g.wikibooks.JScrollPane.getDestino()).JFrame. public class Ventana implements MouseListener.String N) { ArrayList<Enlace> aux=terminal.Color. JButton aplicar. Container contenedor. javax. java.size(). javax.JLabel. VENTANA import java.i++) { Enlace nodo=aux.getInicial())!=-1) return true. return false. static JFrame frame. javax. java.existeEnlace(aVerificar. java. http://es.awt.swing. java.g.event. ItemListener.Cursor.awt.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 12/22 . if(aux.awt.awt.ButtonGroup.JOptionPane. javax.awt.getDestino(). java. if(terminal.getNodo(nodo.ActionEvent. java. import import import import import import import import import import javax. java.JComboBox.remove(pro).JTextArea. 200. titulo. ayudaCombo. radioMod. 20.createBevelBorder(1)). 600).BOLD. JComboBox comboOpcionesRecta.wikibooks. grafo=new Grafo(). ButtonGroup grupo.setBounds(0. radioNodo = new JRadioButton("Crear Nodo"). contenedor=frame. Grafo grafo.ayudaMod. ayuda. ayudaCombo.setBounds(610.addItem("Arista Bucle"). area. titulo. lienzo. panel=new JScrollPane(area).setFont(font). pun = new Punto[2]. pun[1]=null. String ayudaNod. Font font1=new Font("Verdana".Font.y. ayudaCombo. JScrollPane panel.ayudaNue.11).ayudaRes.setBorder(BorderFactory. private int contador = 0. int x. 130.setSelectedIndex(-1). 270. ayuda. 0. comboOpcionesRecta. 250).setFont(font).addItem(">Como hacer un Nodo"). lienzo. ayudaCombo. radioArista.Font. titulo=new JLabel("Dibuje su grafo:").setCursor(Cursor.addItem(">Boton 'Nuevo'"). 600. ayuda=new JLabel("Ayuda:"). lienzo = new Lienzo(). ayudaCombo. int j.PLAIN. comboOpcionesRecta. radioMod = new JRadioButton("Modificar"). 20).addItem(">Como hacer una Arista"). ayudaCombo=new JComboBox(). public Ventana() { frame = new JFrame(). comboOpcionesRecta = new JComboBox(). ayudaCombo. pun[0]=null.CROSSHAIR_CURSOR)). comboOpcionesRecta.setFont(font). http://es.setFont(font).getPredefinedCursor(Cursor.addItem("Arista"). public JTextArea area. ayudaCombo. Font font=new Font("Verdana". Punto pun[]. 100.setBounds(660.setFont(font).setBounds(610.ayudaCombo.addItem("Arista Curva"). area=new JTextArea(). puntos = new ArrayList<Punto>().i. radioArista = new JRadioButton("Crear Arista").addItem(">Boton 'Aplicar'").Wikilibros JLabel ayuda. panel.addItem(">Boton'Reset'").ayudaApl.getContentPane().ayudaAri. aristas = new ArrayList<Arista>().addItem(">Como modificar un Grafo"). 20).setFont(font1).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 13/22 . titulo.12).10/11/2014 Implementación del Algoritmo de Kruskal en Java . lienzo.setFont(font). 280. public Lienzo lienzo. comboOpcionesRecta. ayudaCombo. addMouseMotionListener(this). aplicar=new JButton("Aplicar"). 20). frame. Haga dobl "\n¡¡¡COMO CREAR UNA ARISTA!!!\n\n" + "1. radioMod.160. 100. Seleccione el RadioButton \"Crear Arista\".addActionListener(this). frame.setLayout(null). } public void mouseClicked(MouseEvent evento) { http://es.add(ayuda). contenedor.add(radioArista). nuevo.addItemListener(this).setVisible(true). grupo = new ButtonGroup().setBounds(850. radioNodo.Wikilibros radioNodo. frame.setDefaultCloseOperation(JFrame. contenedor.add(aplicar). radioNodo.EXIT_ON_CLOSE). contenedor. contenedor.setBounds(710. frame.10/11/2014 Implementación del Algoritmo de Kruskal en Java .add(radioNodo).setBounds(680. 20). 20). 80. 80.add(comboOpcionesRecta). recuperar=new JButton("Reset").setLocation(10.20).addItemListener(this). contenedor. 110. radioMod. aplicar.wikibooks. frame.175. radioArista.add(recuperar).addActionListener(this). contenedor.240. 20).setFont(font). recuperar.setBounds(820. contenedor. nuevo.setBounds(815.add(panel). 20).setBounds(670.\n" + "2. contenedor. nuevo=new JButton("Nuevo"). grupo. frame. recuperar.add(radioMod). Sele "\n¡¡¡COMO MODIFICAR EL GRAFO!!!\n\n" + "1.setBounds(680.add(radioNodo). ayudaCombo. grupo. 600).add(titulo). aplicar.setFont(font).setFont(font).addItemListener(this). comboOpcionesRecta.add(lienzo). radioArista. 130.add(ayudaCombo).160. 60.setLayout(null). lienzo.setSelected(true).setTitle("GrafoMatic Displayer"). contenedor. lienzo. Seleccione el RadioButton \"Modificar\". 100.\n" + "2.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 14/22 .addItemListener(this).addMouseListener(this). Seleccione el RadioButton \"Crear Nodo\".setBounds(760. Haga "\n¡¡¡BOTON RESET!!!\n\n" + " Este botón permite recuperar el estado \n" + " del Grafo antes de apl "\n¡¡¡BOTON APLICAR!!!\n\n" + " Este botón permite Aplicar el Algoritmo de\n" + " Kruskal al Grafo "\n¡¡¡BOTON NUEVO!!!\n\n" + " Limpia el area de Dibujo para crear un\n" + " nuevo Grafo y poder apl contenedor. radioNodo. 120. grupo. 110. 80. 20). contenedor.160. recuperar. nuevo.add(nuevo). contenedor.addActionListener(this).\n" + "2.setFont(font).add(radioArista). contenedor.add(radioMod). frame.setSize(1000. ayudaNod ayudaAri ayudaMod ayudaRes ayudaApl ayudaNue = = = = = = "\n¡¡¡COMO CREAR UN NODO!!!\n\n" + "1. aplicar. 20). ayudaCombo. 60.setFont(font). 20). arista. lienzo. punto.getSource()==aplicar) { AlgoritmoKruskal nuevo=new AlgoritmoKruskal().getAristas().repaint().getClickCount() == 2&&radioNodo.getY() . puntos. } } public void itemStateChanged(ItemEvent evento) { if (evento. lienzo.getSource()==recuperar) { for(int i=0. lienzo.isSelected()==true) { String nombre = "hay".getSource() == radioNodo) comboOpcionesRecta.clear().ingresarNodo(nombre).contains(nombre)||nombre==null) { JOptionPane.length(). lienzo. nombre. } if(e.setPuntos(puntos). lienzo.add(punto). nombre grafo. lienzo.getSource()==nuevo) { grafo=new Grafo().getGraphics()). aristas.get(i).128)).getPoint().pintarPunto(lienzo. do { try { nombre = JOptionPane.i++) { Arista arista=(Arista)lienzo.Wikilibros if (evento.i<lienzo. kruskal=nuevo.wikibooks.clear().setColor(new Color(0. (int) evento. } } while(nombre=="hay"). lienzo.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 15/22 .cambiarGrafo(kruskal).aplicarKruskal(grafo).128. } catch(NullPointerException e) { return. lienzo.showInputDialog(null. Punto punto = new Punto((int) evento. } lienzo.getNeo().estado=false. recuerde que no debe ha nombre="hay".getNombres()."Ingrese la Etiqueta del Nodo"). } if(grafo.clear().setEnabled(false).size().getPoint().punto=false.10/11/2014 Implementación del Algoritmo de Kruskal en Java . lienzo. } if(e.getNeo().getX() . http://es.showMessageDialog(null.clear(). } } public void actionPerformed(ActionEvent e) { if(e.clear().5.getNeo().getPuntos().repaint().5. Grafo kruskal= new Grafo()."La Etiqueta es incorrecta.getNeo(). getSelectedIndex()==5) area.isSelected()) lienzo. } lienzo.get(i).get(i).get(i).getPredefinedCursor(Cursor. i++) { if (puntos.getSource()==ayudaCombo) { if(ayudaCombo.ecuacionDeCirculo(arg0.getGraphics().get(i).getSelectedIndex()==4) area.isSelected()) { for (int i = 0. contador++. if(ayudaCombo.setText(ayudaMod). } } contador=0.size().org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 16/22 .setText(ayudaNue). y=puntos.setEnabled(true).RED). } pun[contador] = puntos.getSelectedIndex()==1) area.isSelected()) { http://es.CROSSHAIR_CURSOR)).wikibooks.ecuacionDeCirculo(arg0. if(evento. x=puntos.getSelectedIndex()==3) area. if(comboOpcionesRecta.getSelectedIndex()==1) { pun[contador] = puntos. break. } } } if(radioMod.setText(ayudaNod). } public void mouseReleased(MouseEvent arg0) { if(radioArista.Wikilibros else comboOpcionesRecta.setColorPunto(Color.setText(ayudaAri). i < puntos.get(i).10/11/2014 Implementación del Algoritmo de Kruskal en Java . if(ayudaCombo.get(i). pun[contador] = puntos.get(i).isSelected()) { for (int i = 0.setText(ayudaApl).setText(ayudaRes). } } public void mousePressed(MouseEvent arg0) { contador=0. else lienzo. if(ayudaCombo. if(radioArista.get(i).getSelectedIndex()==0) area.getSource()==radioNodo||radioNodo.RED).getUbicacion().getDefaultCursor()).getUbicacion().getSelectedIndex()==2) area. if(ayudaCombo.setColorPunto(Color.//pintarPunto(lienzo. if(evento. Color.y. i++) { if (puntos.setCursor(Cursor.getPoint())) { puntos. i < puntos.size().getPoint())) { puntos. if(ayudaCombo.setCursor(Cursor.RED).repaint().x.get(i). break. equals(pun[1] contador=0. arista. lienzo. pun[1].getSelectedIndex(). return.BLUE). comboOpcionesRecta. aristas.showInputDialog(null.adicionarEnlace(pun[0]. lienzo. } } while(peso==-1).getUbicacion(). if(contador==2||comboOpcionesRecta. contador=0.BLUE). do { try { peso = Float.parseFloat(JOptionPane. pun[1].getNombre().getPoint())==false||pun[0].BLUE).ecuacionDeCirculo(arg0. pun[1]=null.getGraphics())."El peso de la Arista debe ser un Número".setAristas(aristas).getSelectedIndex()==1) { float peso=-1.repaint().BLUE).Wikilibros if(pun[1]==null||pun[1]. pun[0]=null. pun[0].punto=false.showMessageDialog(null. lienzo." peso=-1.punto=false.pintarRecta(lienzo.add(arista). contador = 0.peso). grafo.pun[1].setColorPunto(Color."Ingrese el Peso de l } catch(NumberFormatException ex) { JOptionPane.10/11/2014 Implementación del Algoritmo de Kruskal en Java .setColorPunto(Color.BLUE). lienzo. lienzo.setColorPunto(Color.setColorPunto(Color. } } if(pun[0]!=null) pun[0]. lienzo.peso). Arista arista=new Arista(pun[0]. } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mouseDragged(MouseEvent e) { if(radioArista.wikibooks.repaint().punto=false.repaint().getNombre(). lienzo. } catch(NullPointerException e) { pun[0].isSelected()) http://es. if(pun[1]!=null) pun[1].setColorPunto(Color.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 17/22 . Color. } if(pun[0]!=null) { lienzo.repaint(). Color.getY()-5). } } Clase Aplicación // Esta clase es la principal y es la que permite ver corriendo el programa. else puntos.setColorPunto( Color.pintarPunto(lienzo.getPoint())) { pun[1] = puntos.isSelected()) { for (int i = 0. pun[0]. i++) { if (puntos. } } public void mouseMoved(MouseEvent e) { if(radioMod.y)). lienzo.Wikilibros { for (int i = 0.ecuacionDeCirculo(e.wikibooks. public class Aplicacion { public static void main(String args[]) { http://es. i < puntos.get(i).isSelected()&&pun[0]!=null) { Point ubicacion=new Point(e.ecuacionDeCirculo(e.RED). break.getGraphics().get(i).getX()-5. } contador=2.size().size().getPoint())) puntos.setColorPunto(Color.setA(new Point(x.setUbicacion(ubicacion).getPoint()). lienzo.pintarPunto(lienzo.get(i).repaint(). i++) { if (puntos.10/11/2014 Implementación del Algoritmo de Kruskal en Java .punto=true.setB(e.BLUE). } } } public Grafo getGrafo() { return grafo.RED). pun[1]. } else if(pun[1]!=null&&pun[1]!=pun[0]) pun[1]. lienzo. i < puntos.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 18/22 .getGraphics().BLUE).e. lienzo.get(i). } if(radioMod.get(i). El algoritmo hace una selección de la menor arista del grafo y la añade a un árbol de manera que al añadirla al árbol no forme un ciclo.java. esto le dice a java que ejecute el main del programa.java.org/20020205113417/www. y diríjase al directorio donde se encuentran todas las clases y digite el siguiente comando java Aplicacion.com/chungara/configurar.wikibooks.java. o para Windows XP la herramienta símbolo del sistema. uno para cada clase y con el mismo nombre de la clase. http://es. mi.java. Pruebas En este primer grafo podemos ver que el algoritmo ha seleccionado las aristas con menor peso que son las de 9 y 10. Más sobre configuración del path (http://web.jsp) o mejores actualizaciones y además debe tener el path de Windows configurado con el jdk.setEditable(false).10/11/2014 } Implementación del Algoritmo de Kruskal en Java . Nuevamente abra la consola. Modo de compilación y ejecución Para poder compilar y ejecutar el programa debe tener instalado en su computador el jdk de java 1. Para compilar abra la consola.sun.class.html) Antes de comenzar tiene que copiar cada una de las clases en un bloc de notas separado y guardarlo con el mismo nombre de la clase y con extensión . esto le dice a java que compile el main del programa que se encuentra en Aplicacion.5 (http://java.archive.geocities. Si lo hace correctamente el programa debe estar corriendo. o símbolo del sistema.Wikilibros } Ventana mi=new Ventana(). estando allí diríjase al directorio donde tiene todas las clases guardadas (Todas las clases deben estar en el mismo directorio para que el programa corra correctamente) y enseguida copie el siguiente comando javac Aplicacion.com/javase/downloads/index_jdk5. Por ejemplo: al copiar la clase AlgoritmoKruskal en un bloc de notas la guarda como AlgoritmoKruskal.area. Para ejecutar tiene que haber compilado primero.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 19/22 . Si hace esto correctamente deben haberse creado en el directorio de las clases varios archivos . Para la implementación de este algoritmo también influye el orden en el cual el usuario dibujo las aristas por que el algoritmo pudo haber seleccionado la arista a-c primero. esto lo veremos más claro en el siguiente ejemplo. Para este caso el usuario dibujo primero http://es. En este segundo ejemplo podemos observar que decisión toma el algoritmo en caso que haya varias aristas con el mismo peso. El algoritmo sigue el mismo criterio. dibujo las aristas. hace una selección de la menor arista del grafo y la añade a un árbol de manera que al añadirla al árbol no forme un ciclo.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 20/22 . El algoritmo añadiría al árbol la arista con peso 4.10/11/2014 Implementación del Algoritmo de Kruskal en Java .wikibooks. como esta no forma ciclo entonces la añade al árbol. hace una selección de la menor arista del grafo y la añade a un árbol de manera que al añadirla al árbol no forme un ciclo. luego la que tiene peso 7 y al momento de añadir la arista de peso 8 se da cuenta que si añade la arista e-d forma un ciclo y la desecharía y tomaría luego a a-c. En este ejemplo podemos ver claramente el criterio del que se habla. luego la arista con peso 5. El algoritmo toma en orden ascendente las aristas pero también tiene en cuenta el orden en el cual. El algoritmo sigue el mismo criterio. el usuario.Wikilibros En este ejemplo el árbol que es creado por el algoritmo es el representado por las líneas rojas en la figura b). Véase también Algoritmo de Prim http://es.wikibooks. en este caso la combinación lineal no es igual a cero. Tiempo empleado Para una implementación óptima del algoritmo haciendo uso de una interfaz grafica y una estructura adicional se hicieron necesarias alrededor de 15 horas.+ aktn-k = bnp(n) Se procede ahora a definir el valor de b=2 y p(n)=n Obteniendo que el polinomio característico es: (x-(n-1)) (x-1)² con raíces (n-1) (de multiplicidad 1) y 1 (de multiplicidad 2). como el de Prim. debido que al momento de implementarlo se tiene la limitante de diseñar un algoritmo adicional que encuentre ciclos que en este caso no es el más óptimo. El algoritmo de kruskal. debido a esto el árbol que da como resultado no me toma la arista c-d por que formaría un ciclo en el árbol.Wikilibros la arista b-d y luego la c-d. Tiempo de Ejecución T(n) Sea T(n) el número de nodos que posee el grafo. Igualmente cada llamada recursiva supondrá una disminución del problema en exactamente la unidad. se concluye inmediatamente que t pertenece a O (n-1)n Conclusiones El algoritmo de kruskal es sencillo de implementar con las herramientas adecuadas. Por último puede observarse que dentro del ciclo se realizan al menos n comparaciones. no es tan óptimo con respecto a otros algoritmos que cumplen el mismo objetivo. puede afirmarse que el número de llamadas recursivas irá disminuyendo en uno puesto que en cada nivel hay un nodo adyacente más que ya ha sido visitado. tal como puede verse en la siguiente expresión: A0tn +a1tn-1 +…. al momento de implementarlo en algún lenguaje de programación.. incluyendo el tiempo que se necesitó para investigar y complementar los conceptos necesarios para lograr el resultado obtenido y deseado. es decir.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 21/22 . Por lo tanto todas las soluciones son de la forma tn= c1(n-1)n +c21n+c3n1n Siempre y cuando t0 >=0 para todo n. ya que se evita igualmente la búsqueda de la arista menor. También sería bueno añadir las aristas en una cola de prioridad. Al momento de implementar el algoritmo es más óptimo ordenar a medida que el usuario ingresa aristas que ordenar después de terminado el grafo. De forma similar.10/11/2014 Implementación del Algoritmo de Kruskal en Java . Con los hechos nombrados con anterioridad es posible establecer la siguiente relación de recurrencia: T(n) = (n-1) T(n-1) + n Siendo esta recurrencia no homogénea. Dado que se trata de un grafo denso podemos afirmar que la longitud del camino máximo será n. 10/11/2014 Implementación del Algoritmo de Kruskal en Java .org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 22/22 .shtml) Obtenido de «http://es.ceid.Wikilibros Algoritmo de Kruskal Teoría de grafos Algoritmo voraz Enlaces externos Animación del algoritmo de Kruskal (http://students.htm) Creación y solución de laberintos por los algoritmos de Kruskal y Prim (http://www.wikibooks. Véase Términos de uso para más detalles.gr/~papagel/project/kruskal. pueden aplicarse términos adicionales.cut-theknot.org/w/index. http://es.tokushimau.org/Curriculum/Games/Mazes.is.wikibooks.0. El texto está disponible bajo la Licencia Creative Commons Atribución-CompartirIgual 3.ac.jp/~ikeda/suuri/kruskal/Kruskal.shtml) Otra Animación (incluye código en JAVA) (http://www-b2.php? title=Implementación_del_Algoritmo_de_Kruskal_en_Java&oldid=216846» Categorías: Wikilibros:Fusionar Wikilibros:Libros para dividir en subpáginas Esta página fue modificada por última vez el 10 ene 2014 a las 22:56.upatras.
Report "Implementación Del Algoritmo de Kruskal en Java - Wikilibros"