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 private int enlacesExistentes. } public Nodo(String newName) { nombre = newName. } public String getDestino() { return destino. private ArrayList<Enlace> enlaces.util. public ArrayList<Enlace> getEnlaces() { return enlaces. enlaces = new ArrayList<Enlace>(). public class Nodo { private String nombre. double peso1) { destino = desti. peso = peso1. } public void modificar(double peso1) { peso = peso1. import java.ArrayList. import javax.Wikilibros public class Enlace { private String destino. } Clase Nodo Hace referencia a un nodo del grafo.wikibooks.swing. } public String getNombre() { http://es. enlacesExistentes = -1. } } public double getPeso() { return peso. } public Enlace(String desti) { destino = desti.10/11/2014 Implementación del Algoritmo de Kruskal en Java . public Enlace(String desti. private double peso. peso = -1.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 3/22 . guardando un nombre y una serie de enlaces a otros nodos.JOptionPane. } public int getEnlacesExistentes() { return enlacesExistentes. public class Arco { http://es. } Clase Arco Guarda la referencia del nodo inicial.peso)). i++) { Enlace miEnlace.remove(posicion). enlacesExistentes++. miEnlace = enlaces. } } boolean eliminarEnlace(int posicion) { if (posicion >= 0 && posicion <= enlaces. } public double enlacePosicion(int posi) { Enlace miEnlace.Wikilibros return nombre.getDestino(). } else { int posicion. return true.10/11/2014 Implementación del Algoritmo de Kruskal en Java . i < enlaces.getDestino(). return false. miEnlace = enlaces. miEnlace = enlaces. posicion = existeEnlace(enlazar). } else JOptionPane.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 4/22 . } return -1. "No hay enlace en la posicion " + posicion).equals(enlazar)) return i. enlacesExistentes--.wikibooks. return miEnlace.getPeso(). return miEnlace.get(i).peso)).get(posi). nodo terminal y peso de un determinado arco del grafo. enlacesExistentes++.add(new Enlace(enlazar.showMessageDialog(null.get(posi). } } } public int existeEnlace(String enlazar) { for (int i = 0. } public String NodoPosicion(int posi) { Enlace miEnlace.size()) { enlaces. } public void agregarEnlace(String enlazar.size().double peso) { if (enlacesExistentes == -1) { enlaces. if (posicion == -1) { enlaces.add(new Enlace(enlazar. if (miEnlace. public class Grafo { ArrayList <String>nombres.10/11/2014 Implementación del Algoritmo de Kruskal en Java . public Arco(String ini. compuesta por nodos y arcos. Hashtable <String. public Grafo() { nombres=new ArrayList<String>(). peso = pes. } } public String toString() { return "(" + inicial + ". " + terminal + ". } public void setPeso(float peso) { this. terminal = ter. } public float getPeso() { return peso.peso = peso. } public String getInicial() { return inicial. String ter.Hashtable.terminal = terminal.wikibooks. aristas=new ArrayList <Arco>().Nodo>(). } Clase Grafo Representa la estructura grafo. } public void setTerminal(String terminal) { this. float pes) { inicial = ini.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 5/22 . " + peso + ")". private float peso.Nodo> nodos. } public String getTerminal() { return terminal.ArrayList. nodos=new Hashtable <String. private String terminal.inicial = inicial.Wikilibros private String inicial. } public void ingresarNodo(String nombre) http://es. import java.util.util. import java. } public void setInicial(String inicial) { this. ArrayList <Arco>aristas. nodos.get(i).agregarEnlace(nodoInicial.getTerminal().float peso) { Arco nuevo=new Arco(nodoInicial.Nodo > muchos) { nodos=muchos.add(nuevo).size().peso). } } Interfaz Gráfica http://es. nodos.add(i. } public void setNodos(Hashtable<String.nuevo). } public ArrayList<Arco> getAristas() { return aristas. } public ArrayList<String> getNombres() { return nombres.i++) { Arco otro=aristas. } public void setNombres(ArrayList<String> nombres) { this.getInicial())&&arco.new Nodo(nombre)).i<aristas.i<aristas. int i=buscarIndice(nuevo. } public boolean busarArista(Arco arco) { for(int i=0.nombres = nombres.getInicial(). nodos.equals(otro. } public void adicionarEnlace(String nodoInicial. } public int buscarIndice(float peso) { for(int i=0.equals(otro.get(nombre). if(i==-1) aristas. } public void setAristas(ArrayList<Arco> aristas) { this.10/11/2014 Implementación del Algoritmo de Kruskal en Java .agregarEnlace(nodoTerminal.get(i).put(nombre.nodoTerminal.getPeso()) return i. if(arco.String nodoTerminal. } public Nodo getNodo(String nombre) { return (Nodo)nodos.add(nombre).aristas = aristas. } return -1.size().remove(otro).getPeso()). } } return false.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 6/22 .get(nodoInicial).peso).Wikilibros { nombres.i++) { if(peso<aristas.get(nodoTerminal).peso).wikibooks. return true. } public Hashtable getNodos() { return nodos. else aristas.getTerminal())&& { aristas. g.drawLine((int) a. private Point a. (int) b. arista.busarArista(aux) == true) neo.pintarRecta(g).JComponent. arista.pintarRecta(g).getAristas(). punto.*.get(i).ArrayList. } public void paintComponent(Graphics g) { if (punto) { g. } for (int i = 0. } if (estado) for (int i = 0. private ArrayList<Arista> aristas. (int) b. for (int i = 0. } if (nuevo.add(n). puntos = new ArrayList<Punto>().size(). http://es. i < aristas.get(i).pintarPunto(g). i++) { final Arista arista = (Arista) aristas. } for (int i = 0. nuevo.getX() + 5. i++) { aux = aristas.get(i)).size(). import java.awt.BLUE). private ArrayList<Arista> neo.get(i).wikibooks. } estado = true.getX() + 5.size(). i++) { final Arista arista = (Arista) neo. import javax. public boolean punto = false.util.add(aristas.get(i). i++) { final Arco n = aristas. import java.getY() + 5.getY() + 5).get(i). i < aristas. public boolean estado = false. i++) { final Punto punto = (Punto) puntos. for (int i = 0. i < puntos.setColor(Color.size().swing.getArista().size(). } } public void cambiarGrafo(Grafo nuevo) { Arco aux. (int) a. i < aristas.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 7/22 . arista.10/11/2014 Implementación del Algoritmo de Kruskal en Java . i < neo.Wikilibros Clase Lienzo Es el lienzo sobre el cual se dibujará el grafo.setColor(Color. neo = new ArrayList<Arista>().RED). b. public Lienzo() { aristas = new ArrayList<Arista>(). public class Lienzo extends JComponent { private ArrayList<Punto> puntos.getArista(). awt. public class Punto { private Point ubicacion. private String nombre. } public void setPuntos(final ArrayList<Punto> puntos) { this. private Color colorPunto = Color. http://es. this.awt.aristas = aristas. private static final int RADIO = 10. } public ArrayList<Arista> getNeo() { return neo.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 8/22 . } Clase Punto Permite dibujar un punto sobre el lienzo. } public void setA(Point a) { this.puntos = puntos. public Punto(int x.b = b. } } public void setB(Point b) { this. } public void pintarPunto(Graphics g) { g. } public ArrayList<Arista> getAristas() { return aristas. } public void setAristas(final ArrayList<Arista> aristas) { this. import java.Graphics.BLACK). int y.Point.Wikilibros } repaint(). String nombre) { ubicacion = new Point(x.Color.nombre = nombre. Hace referencia a la posición del punto sobre el lienzo.neo = neo. import java.10/11/2014 Implementación del Algoritmo de Kruskal en Java .wikibooks.setColor(Color.BLUE. } public void setNeo(final ArrayList<Arista> neo) { this. y). import java.awt. public ArrayList<Punto> getPuntos() { return puntos.a = a. 10). g. aux = Color. b.geom. ubicacion.wikibooks. 10.Graphics2D.Wikilibros } g. } public Point getUbicacion() { return ubicacion.x . } public void setUbicacion(Point ubicacion) { this. ubicacion.y .awt. } public boolean ecuacionDeCirculo(Point punto) { return (((punto. private Punto a.Point.setColor(colorPunto).fillOval(ubicacion.fillOval(ubicacion.y. java.y) * (punto.setColor(Color. } public String getNombre() { return nombre. 10). } public void setColorPunto(Color colorPunto) { this. java.drawString(nombre. } public Color getColorPunto() { return colorPunto. ubicacion.y . ubicacion. Color color) { g.x. ubicacion.Color. int tipo. private float peso. ubicacion. import import import import import java.colorPunto = colorPunto. private Point inicial. private Color color = new Color(0. 10. g.3.ubicacion.awt.awt. public class Arista { private Arco arista.RED.setColor(color).ubicacion. public void pintarPunto(Graphics g. 128). g. ubicacionExt. private int tipo. 128.10/11/2014 Implementación del Algoritmo de Kruskal en Java .ubicacion.3. } } Clase Arista Permite dibujar una arista entre dos puntos sobre el lienzo.x) + (punto.x. java.x) * (punto.y . float peso) { http://es.x .QuadCurve2D.ubicacion. g.y .BLACK).ubicacion = ubicacion.x . g.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 9/22 .3).drawString(nombre. public Arista(Punto puntoA. Hace referencia a los puntos. private Point terminal. java.y.3).awt. Punto puntoB.Graphics.awt.x . g.x + terminal.drawString(peso + "".30).10. } public int getTipo() { http://es.setCurve(tempInicial. inicial.atan(m). g.y + 5. } a = puntoA. (inicial.y + terminal.x if (grado <= 90 && grado > 45) control = new Point((inicial.Double().y . Point control = null. double a = (inicial.setColor(color).tipo = tipo.wikibooks. if (grado > 0) { if (grado <= 45 && grado >= 0) control = new Point((inicial.x + 5.setColor(color). terminal = b.peso = peso.draw(quad).getNombre().x } + terminal.drawString(peso + "". quad.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 10/22 . 30.x) / 2 . control.x + 5. g.y + 5).setColor(color). break.10.getUbicacion(). g.terminal. } } public Point getUbicacion() { return ubicacionExt. g.x if (grado >= -90 && grado < -45) control = new Point((inicial. + terminal. inicial. tempFinal).x) / 2 . + terminal. switch (tipo) { case 0: case 1: case 2: g. peso).y .y + terminal.getNombre().y + terminal.y + 5).Double quad = new QuadCurve2D.x) / 2.3.x } else { if (grado >= -45 && grado <= 0) control = new Point((inicial. terminal. g.terminal.getUbicacion(). inicial.30.x .setColor(aux). this.x + 5.x + 5.setColor(aux). b = puntoB. 30).x) / 2 + 50.Wikilibros arista = new Arco(puntoA. Point tempInicial = new Point(inicial. (inicial. break.x . (inicial.y . control. this.x). puntoB. terminal. double m = a / b. tempFinal = new Point(terminal. terminal. g.drawOval(inicial.x) / 2 . (inicial.drawLine(inicial. inicial.y + 5). public void pintarRecta(Graphics ga) { inicial = a.y) / 2).x . + terminal. break.y).30. (inicial.y + terminal.setColor(aux).y + terminal. double grado = Math. inicial.drawString(peso + "". control. double b = (inicial. QuadCurve2D.10/11/2014 Implementación del Algoritmo de Kruskal en Java . g. Graphics2D g = (Graphics2D) ga.y).50. (inicial. g. g.x. g. árbol.ingresarNodo(nodos.árbol.wikibooks. if(HayCiclo(árbol.10/11/2014 Implementación del Algoritmo de Kruskal en Java . pro.clone(). pro. 128).Wikilibros } return tipo.j++) { árbol.getTerminal()) .get(0).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 11/22 . ArrayList<String> nodos=grafo.j<nodos. while(L. public class AlgoritmoKruskal { @SuppressWarnings("unchecked") public Grafo aplicarKruskal(Grafo grafo) { Grafo árbol=new Grafo().RED. else aux = Color.getTerminal().adicionarEnlace(pro.color = color. } public void setArista(Arco arista) { this. pro. import java.getPeso()).get(j)). 128))) aux = Color. 128.getInicial(). for(int j=0.equals(new Color(0. Arco pro=L.size().adicionarEnlace(pro. } public void setColor(Color color) { if (color. } public void getColor() { color = new Color(0.BLUE.getNodo(pro.getTerminal())==false) árbol.get(0).size()!=0) { pro=L. aux = Color. } ArrayList<Arco> L=(ArrayList<Arco>)grafo.getTerminal().ArrayList. public Arco getArista() { return arista. http://es. Paquete Principal Clase AlgoritmoKruskal //Implementación del Algoritmo voraz de Kruskal. 128.util.getPeso()).RED.remove(pro). pro.arista = arista. pro.getInicial().getAristas().getNombres(). } } this. pro. L. java. http://es.swing. java.ItemEvent.existeEnlace(aVerificar.wikibooks. } } } if(nodo.swing.event.getDestino()).event. javax.JFrame.JButton.Font.Cursor.swing. ActionListener.MouseMotionListener.MouseEvent.Container.event.awt. MouseMotionListener { int cantidad = 0.getDestino(). java.JTextArea.size().Point.10/11/2014 Implementación del Algoritmo de Kruskal en Java .swing. java. javax.equals(N)==false) if( HayCiclo(g.awt.swing. javax. radioMod.awt.MouseListener.JComboBox.ArrayList.swing.swing. javax.size()==0) return false.ItemListener. import import import import import import import import import import javax.ButtonGroup. java.terminal.recuperar. JButton aplicar. import import import import import import import import import import import import java. Container contenedor.awt. java.awt. javax.swing.g.JOptionPane. java.nuevo. ArrayList<Arista> aristas. if(aux. ItemListener.util.getNombre())) return true.ActionListener.BorderFactory.String N) { ArrayList<Enlace> aux=terminal.JLabel. javax.aVerificar.event.swing.event.JScrollPane. java.awt.remove(pro). static JFrame frame.awt.event. javax. radioArista. java. for(int i=0. return árbol. javax.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 12/22 .awt.awt.Color.awt. VENTANA import java. ArrayList<Punto> puntos.ActionEvent.event. java.awt.i<aux.Wikilibros } } L.awt.Arco aVerificar.swing.JRadioButton. return false.i++) { Enlace nodo=aux. public boolean HayCiclo(Grafo g. javax.Nodo terminal. public class Ventana implements MouseListener. JRadioButton radioNodo.getNodo(nodo. java. if(terminal.get(i).getInicial())!=-1) return true.getEnlaces(). comboOpcionesRecta.ayudaApl. aristas = new ArrayList<Arista>().BOLD.addItem("Arista Curva").Font.setBounds(610. pun = new Punto[2]. ButtonGroup grupo. lienzo. public JTextArea area. panel. radioArista. lienzo.Wikilibros JLabel ayuda. ayudaCombo. lienzo. titulo. JScrollPane panel.ayudaAri.setFont(font).y.ayudaMod.addItem("Arista"). comboOpcionesRecta = new JComboBox(). 200.ayudaNue. ayuda. 0. radioMod = new JRadioButton("Modificar"). 20. 20).createBevelBorder(1)). ayudaCombo.PLAIN.addItem(">Boton'Reset'"). ayudaCombo.Font. comboOpcionesRecta. JComboBox comboOpcionesRecta. radioArista = new JRadioButton("Crear Arista"). titulo=new JLabel("Dibuje su grafo:").addItem(">Como hacer una Arista"). titulo. ayudaCombo. 250). 20). public Lienzo lienzo.11).setFont(font).setBounds(0.ayudaRes. private int contador = 0. area=new JTextArea().10/11/2014 Implementación del Algoritmo de Kruskal en Java . pun[1]=null.i. ayuda=new JLabel("Ayuda:"). lienzo = new Lienzo(). titulo.setFont(font).getContentPane().ayudaCombo. contenedor=frame. puntos = new ArrayList<Punto>(). grafo=new Grafo().addItem(">Boton 'Nuevo'").addItem("Arista Bucle").addItem(">Como modificar un Grafo"). Font font=new Font("Verdana". ayudaCombo. ayudaCombo=new JComboBox().getPredefinedCursor(Cursor.setBorder(BorderFactory.addItem(">Boton 'Aplicar'").setBounds(610. ayudaCombo. area.wikibooks. Grafo grafo. panel=new JScrollPane(area).addItem(">Como hacer un Nodo"). public Ventana() { frame = new JFrame(). comboOpcionesRecta. pun[0]=null. String ayudaNod.setBounds(660.setSelectedIndex(-1). comboOpcionesRecta. 270. ayuda. int j.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 13/22 .12). http://es.CROSSHAIR_CURSOR)).setCursor(Cursor. radioMod.setFont(font). Font font1=new Font("Verdana". 130. Punto pun[]. 280.setFont(font). 100. 600). radioNodo = new JRadioButton("Crear Nodo"). int x. ayudaCombo.setFont(font). ayudaCombo.setFont(font1). 600. setSize(1000.add(radioArista). nuevo. contenedor.addItemListener(this). aplicar.setDefaultCloseOperation(JFrame. radioArista. 20). contenedor.add(recuperar). contenedor. 100.add(nuevo). aplicar. radioNodo.20).add(ayuda).setBounds(710.add(aplicar). contenedor. nuevo. frame.Wikilibros radioNodo.setBounds(670. radioMod. 80.EXIT_ON_CLOSE). ayudaCombo.setBounds(760. 110. nuevo=new JButton("Nuevo"). recuperar=new JButton("Reset").setFont(font). contenedor. contenedor.setBounds(680.wikibooks. contenedor. grupo.setFont(font).add(radioArista). Sele "\n¡¡¡COMO MODIFICAR EL GRAFO!!!\n\n" + "1.setBounds(680. ayudaNod ayudaAri ayudaMod ayudaRes ayudaApl ayudaNue = = = = = = "\n¡¡¡COMO CREAR UN NODO!!!\n\n" + "1. 20).add(panel).setFont(font). radioNodo. nuevo.addActionListener(this).add(lienzo).setSelected(true). 20).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 14/22 .setBounds(815.setFont(font).setLayout(null).175. contenedor.setLayout(null). Seleccione el RadioButton \"Modificar\". 20). grupo.setLocation(10. frame.setBounds(850. Haga dobl "\n¡¡¡COMO CREAR UNA ARISTA!!!\n\n" + "1. 600). frame. 60. ayudaCombo. 20).add(radioMod).add(radioNodo).160. frame. 20).addActionListener(this). contenedor. recuperar.addItemListener(this).setFont(font). 80. } public void mouseClicked(MouseEvent evento) { http://es. frame. Seleccione el RadioButton \"Crear Arista\". recuperar. frame. aplicar=new JButton("Aplicar"). contenedor.setVisible(true).setTitle("GrafoMatic Displayer"). 120.160.10/11/2014 Implementación del Algoritmo de Kruskal en Java .addMouseMotionListener(this). contenedor. 110. 20).\n" + "2. radioMod. 20).add(comboOpcionesRecta). recuperar.add(radioNodo).160. contenedor. 130.240. grupo = new ButtonGroup(). Seleccione el RadioButton \"Crear Nodo\".add(titulo). 100. aplicar. frame.add(radioMod). 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.\n" + "2.addMouseListener(this). lienzo. radioNodo. 60.\n" + "2. 80.add(ayudaCombo). lienzo. radioArista.addItemListener(this).addActionListener(this). comboOpcionesRecta.addItemListener(this). grupo.setBounds(820. showInputDialog(null. } } public void itemStateChanged(ItemEvent evento) { if (evento.showMessageDialog(null.repaint().getAristas(). lienzo. kruskal=nuevo.aplicarKruskal(grafo). lienzo. punto.getPuntos(). (int) evento.punto=false.getSource()==nuevo) { grafo=new Grafo().size(). } lienzo.getNeo().getSource()==recuperar) { for(int i=0. lienzo.contains(nombre)||nombre==null) { JOptionPane.setPuntos(puntos).wikibooks. puntos.getPoint().length().Wikilibros if (evento.getNeo(). Grafo kruskal= new Grafo().128)). } catch(NullPointerException e) { return.setColor(new Color(0.getSource()==aplicar) { AlgoritmoKruskal nuevo=new AlgoritmoKruskal(). nombre. lienzo.10/11/2014 Implementación del Algoritmo de Kruskal en Java ."La Etiqueta es incorrecta.getNeo().128. recuerde que no debe ha nombre="hay". lienzo.pintarPunto(lienzo.getGraphics()).getPoint(). arista. lienzo.getNombres().5.estado=false. aristas.clear(). do { try { nombre = JOptionPane."Ingrese la Etiqueta del Nodo").repaint().isSelected()==true) { String nombre = "hay".clear().ingresarNodo(nombre).i<lienzo.clear(). lienzo. nombre grafo. } if(grafo. } if(e.getY() .clear(). lienzo.cambiarGrafo(kruskal).5.i++) { Arista arista=(Arista)lienzo. http://es.clear(). } } while(nombre=="hay").getSource() == radioNodo) comboOpcionesRecta. lienzo.getClickCount() == 2&&radioNodo.get(i).add(punto).setEnabled(false).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 15/22 .getX() . } if(e. Punto punto = new Punto((int) evento.getNeo(). } } public void actionPerformed(ActionEvent e) { if(e. getDefaultCursor()).Wikilibros else comboOpcionesRecta.wikibooks.getSelectedIndex()==5) area. } } } if(radioMod. if(ayudaCombo.get(i).getUbicacion().getSelectedIndex()==2) area.setText(ayudaNod).get(i).getSelectedIndex()==4) area.size(). if(ayudaCombo.RED).setCursor(Cursor.setColorPunto(Color.getGraphics().setText(ayudaNue).getSelectedIndex()==3) area. i < puntos. contador++.getSelectedIndex()==1) { pun[contador] = puntos. pun[contador] = puntos. if(comboOpcionesRecta.get(i). break. i++) { if (puntos.ecuacionDeCirculo(arg0.x.repaint(). } } contador=0.isSelected()) { for (int i = 0. if(ayudaCombo.get(i).setText(ayudaApl).get(i).getSource()==radioNodo||radioNodo. break.RED).CROSSHAIR_CURSOR)).getPoint())) { puntos.getSelectedIndex()==0) area.get(i).getPoint())) { puntos. if(ayudaCombo.getSelectedIndex()==1) area.setText(ayudaMod).RED).setCursor(Cursor.isSelected()) lienzo. if(evento.ecuacionDeCirculo(arg0. if(evento.get(i). } } public void mousePressed(MouseEvent arg0) { contador=0. else lienzo.size(). y=puntos.getPredefinedCursor(Cursor. } public void mouseReleased(MouseEvent arg0) { if(radioArista.isSelected()) { for (int i = 0. i++) { if (puntos.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 16/22 . if(ayudaCombo.//pintarPunto(lienzo.getUbicacion().get(i).y.isSelected()) { http://es.get(i).setText(ayudaRes).setEnabled(true). Color. if(radioArista.10/11/2014 Implementación del Algoritmo de Kruskal en Java . i < puntos. } lienzo. x=puntos. } pun[contador] = puntos.setColorPunto(Color.setText(ayudaAri).getSource()==ayudaCombo) { if(ayudaCombo. contador=0. lienzo. comboOpcionesRecta.pun[1].BLUE).getUbicacion(). } catch(NullPointerException e) { pun[0]. do { try { peso = Float."El peso de la Arista debe ser un Número".10/11/2014 Implementación del Algoritmo de Kruskal en Java . return.showMessageDialog(null.repaint(). arista.setColorPunto(Color. lienzo.getNombre(). } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mouseDragged(MouseEvent e) { if(radioArista.isSelected()) http://es.showInputDialog(null.setAristas(aristas).repaint().BLUE).setColorPunto(Color.Wikilibros if(pun[1]==null||pun[1]. pun[1]. lienzo. aristas. pun[0].BLUE).BLUE).getSelectedIndex().punto=false.ecuacionDeCirculo(arg0.parseFloat(JOptionPane. grafo." peso=-1.adicionarEnlace(pun[0].org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 17/22 .equals(pun[1] contador=0. pun[0]=null. } } if(pun[0]!=null) pun[0].punto=false. lienzo. Arista arista=new Arista(pun[0].peso). if(pun[1]!=null) pun[1]. if(contador==2||comboOpcionesRecta.peso).setColorPunto(Color.getSelectedIndex()==1) { float peso=-1. contador = 0.add(arista). } } while(peso==-1).getNombre().setColorPunto(Color. lienzo.repaint(). lienzo."Ingrese el Peso de l } catch(NumberFormatException ex) { JOptionPane.pintarRecta(lienzo.BLUE).getGraphics()). pun[1]=null.setColorPunto(Color. pun[1].wikibooks.getPoint())==false||pun[0]. lienzo.punto=false. repaint(). Color.getY()-5).RED).size().getGraphics(). } if(pun[0]!=null) { lienzo.BLUE). } else if(pun[1]!=null&&pun[1]!=pun[0]) pun[1]. lienzo.get(i). else puntos.RED). } } Clase Aplicación // Esta clase es la principal y es la que permite ver corriendo el programa.isSelected()) { for (int i = 0. lienzo. } } public void mouseMoved(MouseEvent e) { if(radioMod.Wikilibros { for (int i = 0. } if(radioMod.ecuacionDeCirculo(e. break.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 18/22 .getGraphics().ecuacionDeCirculo(e. } } } public Grafo getGrafo() { return grafo. lienzo.get(i).punto=true. public class Aplicacion { public static void main(String args[]) { http://es.BLUE).get(i). i++) { if (puntos.size(). Color. pun[0].getPoint())) { pun[1] = puntos.repaint().setUbicacion(ubicacion). pun[1].get(i).getX()-5.pintarPunto(lienzo.10/11/2014 Implementación del Algoritmo de Kruskal en Java .isSelected()&&pun[0]!=null) { Point ubicacion=new Point(e.getPoint())) puntos. lienzo.setColorPunto( Color. i < puntos.y)).setA(new Point(x. } contador=2.get(i). i++) { if (puntos.getPoint()). i < puntos.wikibooks.e.setB(e.pintarPunto(lienzo.setColorPunto(Color. uno para cada clase y con el mismo nombre de la clase. o símbolo del sistema.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.10/11/2014 } Implementación del Algoritmo de Kruskal en Java .java.class. Por ejemplo: al copiar la clase AlgoritmoKruskal en un bloc de notas la guarda como AlgoritmoKruskal.java.geocities. 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.area.5 (http://java.Wikilibros } Ventana mi=new Ventana(). Si hace esto correctamente deben haberse creado en el directorio de las clases varios archivos . esto le dice a java que ejecute el main del programa. 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. o para Windows XP la herramienta símbolo del sistema.wikibooks. http://es.org/20020205113417/www. y diríjase al directorio donde se encuentran todas las clases y digite el siguiente comando java Aplicacion.archive.sun. Más sobre configuración del path (http://web.com/chungara/configurar.setEditable(false). 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.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 19/22 . Para ejecutar tiene que haber compilado primero.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 . mi. esto le dice a java que compile el main del programa que se encuentra en Aplicacion.java.com/javase/downloads/index_jdk5. Nuevamente abra la consola. Si lo hace correctamente el programa debe estar corriendo.jsp) o mejores actualizaciones y además debe tener el path de Windows configurado con el jdk. Para compilar abra la consola. como esta no forma ciclo entonces la añade al árbol. 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. 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. luego la arista con peso 5. En este segundo ejemplo podemos observar que decisión toma el algoritmo en caso que haya varias aristas con el mismo peso.Wikilibros En este ejemplo el árbol que es creado por el algoritmo es el representado por las líneas rojas en la figura b). En este ejemplo podemos ver claramente el criterio del que se habla. 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. 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. esto lo veremos más claro en el siguiente ejemplo. el usuario. Para este caso el usuario dibujo primero http://es.wikibooks. El algoritmo añadiría al árbol la arista con peso 4. El algoritmo sigue el mismo criterio. El algoritmo sigue el mismo criterio. El algoritmo toma en orden ascendente las aristas pero también tiene en cuenta el orden en el cual.10/11/2014 Implementación del Algoritmo de Kruskal en Java .org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 20/22 . Wikilibros la arista b-d y luego la c-d.10/11/2014 Implementación del Algoritmo de Kruskal en Java . Igualmente cada llamada recursiva supondrá una disminución del problema en exactamente la unidad. 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. 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. al momento de implementarlo en algún lenguaje de programación. es decir. Dado que se trata de un grafo denso podemos afirmar que la longitud del camino máximo será n.+ 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).org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 21/22 .. 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.wikibooks. Véase también Algoritmo de Prim http://es. se concluye inmediatamente que t pertenece a O (n-1)n Conclusiones El algoritmo de kruskal es sencillo de implementar con las herramientas adecuadas. También sería bueno añadir las aristas en una cola de prioridad. ya que se evita igualmente la búsqueda de la arista menor. Tiempo de Ejecución T(n) Sea T(n) el número de nodos que posee el grafo. 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. 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. como el de Prim. en este caso la combinación lineal no es igual a cero. tal como puede verse en la siguiente expresión: A0tn +a1tn-1 +…. 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. incluyendo el tiempo que se necesitó para investigar y complementar los conceptos necesarios para lograr el resultado obtenido y deseado. 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. 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. De forma similar. 0.ac.jp/~ikeda/suuri/kruskal/Kruskal. http://es.org/Curriculum/Games/Mazes. El texto está disponible bajo la Licencia Creative Commons Atribución-CompartirIgual 3.shtml) Otra Animación (incluye código en JAVA) (http://www-b2. pueden aplicarse términos adicionales.org/wiki/Implementaci%C3%B3n_del_Algoritmo_de_Kruskal_en_Java 22/22 .is.cut-theknot.shtml) Obtenido de «http://es.wikibooks.tokushimau.org/w/index.gr/~papagel/project/kruskal. Véase Términos de uso para más detalles.10/11/2014 Implementación del Algoritmo de Kruskal en Java .htm) Creación y solución de laberintos por los algoritmos de Kruskal y Prim (http://www.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.wikibooks.Wikilibros Algoritmo de Kruskal Teoría de grafos Algoritmo voraz Enlaces externos Animación del algoritmo de Kruskal (http://students.ceid.upatras.
Report "Implementación Del Algoritmo de Kruskal en Java - Wikilibros"