 Árbol de mínima expansión:
Árbol de máximo alcance cuyo valor
es mínimo, es decir, la suma de sus
aristas es mínima.
 Algoritmo de Kruskal: El algoritmo de Kruskal
permite hallar el árbol minimal de cualquier grafo
valorado (con capacidades). Hay que seguir los
siguientes pasos:
 Se marca la arista con menor valor. Si hay más
de una, se elige cualquiera de ellas.
 De las aristas restantes, se marca la que tenga
menor valor, si hay más de una, se elige
cualquiera de ellas.
 Repetir el paso 2 siempre que la
arista elegida no forme un ciclo
con las ya marcadas.
 El proceso termina cuando
tenemos todos los nodos del
grafo en alguna de las aristas
marcadas, es decir, cuando
tenemos marcados n-1 arcos,
siendo n el número de nodos del
grafo.
Ejemplo: Determinar el árbol de
mínima expansión para el siguiente
grafo:
Siguiendo el algoritmo de Kruskal, tenemos:
Elegimos, por ejemplo, la arista (5, 6) = 1 (menor valor)
y la marcamos.
Elegimos la siguiente arista con menor valor (1, 3) = 1 y
la marcamos.
Elegimos la siguiente arista con menor valor (5, 7) = 2 y
la marcamos, ya que no forma ciclos con ninguna arista de
las marcadas anteriormente.
 Elegimos la siguiente arista con menor valor (1, 2) = 3 y la
marcamos, ya que no forma ciclos con ninguna arista de las
marcadas anteriormente.
 Elegimos la siguiente arista con menor valor (6, 7) = 4 y la
desechamos, ya que forma ciclos con las aristas (5, 7) y (5,
6) marcadas anteriormente.
 Elegimos la siguiente arista con menor valor (2, 5) = 5 y la
marcamos, ya que no forma ciclos con ninguna arista de las
marcadas anteriormente.
 Elegimos la siguiente arista con menor valor (4, 5) = 6 y la
marcamos, ya que no forma ciclos con ninguna arista de las
marcadas anteriormente.
 FIN. Finalizamos dado que los 7 nodos del grafo están en
alguna de las aristas, o también ya que tenemos marcadas 6
aristas (n-1).
 Por tanto el árbol de mínima expansión resultante sería:
 <iostream.h> # include # include
<process.h> <malloc.h> # include # define
MAX 20 borde struct { int u, v int, int peso;
borde * enlace; } * frente = NULL; int padre
[ MAX]; / * Mantiene el padre de cada nodo
* / árbol
CODIGO Y PSEUDOCODIGO
<img src="http://www.tech-
faq.com/components/com_glossary/
images/plugin/messagebox_info.pn
g" border="0" align="top"
alt="Glossary Link" />
 <a class="glossarylink"
 href="/index.php?
option=com_glossary&Itemid=239&id=402&letter
=E&lang=es" title="EDGE (Enhanced Data Rates
for Global Evolution) – is an improved GPRS
standard used to obtain rich content data. It
broadcasted four times faster than conventional
transmission. The speed of EDGE network
depends upon various aspects, such as service
outages, traffic volume, signal strength and the
Internet speed. ">edge</a> [MAX]; / *
contendrá los bordes del árbol de expansión * /
int n; / * Indica el número total de nodos en el
 gráfico * / int wt_tree = 0; / * Peso del árbol
de expansión * / int count = 0; / * Indica el
número de aristas incluidas en el árbol * / / *
Funciones * / void make_tree (); insert_tree
(int i, j int, int peso); void insert_pque (int i, j
int, int peso); borde * del_pque ();
create_graph void (); void main () { int i;
create_graph (); make_tree (); cout << "los
bordes que se incluirán en el árbol de
expansión se :  n "; for (i = 1; i <= count; i +
+) { tribunal <<árbol [i]. u; tribunal <<árbol
[i]. V; } tribunal <<" Peso de este árbol de
expansión mínima es: "<<wt_tree; } / * Fin de
main () * / void create_graph ()
 { int i, en peso, max_edges, origen, destino;
cout <<" Introduzca el número de nodos: ";
cin>> n; max_edges * = n (n-1) / 2; for (i =
1; i <= max_edges; i + +) { tribunal <<
"Introduzca el borde" <<i << "(0 0 para dejar
de fumar):" cin>> romper origen; cin>>
destino; if ((origen == 0) & & (destino == 0));
cout << " n Introduzca el peso de este canto:"
cin>> peso; if (origen> n | | Destin> n | |
origen <= 0 | | destin <= 0) { tribunal << "no
válido borde  n"; i -; } más insert_pque
(origen, destino, peso); } if (i <n - 1) { tribunal
<< " nSpanning árbol no es posible  n";
salida (1); } } / * Fin de create_graph () * /
void make_tree () { borde * tmp; int nodo1,
nodo2,
 <img src="http://www.tech-
faq.com/components/com_glossary
/images/plugin/messagebox_info.p
ng" border="0" align="top"
alt="Glossary Link" />
 <a
class="glossarylink"
 href="/index.php?
option=com_glossary&Itemid=239&id=240&lett
er=R&lang=es" title="also called the
administrator account. Root refers to the user
with the permission on every mode of a multi-
user or single OS. The root in PC file structure
is recognized as the top-most or the first
directory within the chain of command.
">root</a>_n1, root_n2 while (count <n-1) / *
bucle hasta n-1 aristas incluidas en el árbol * /
tmp = { del_pque (); nodo1 = tmp-> u; nodo2
= tmp-> v; tribunal << " nn1 = "<<nodo1;
cout <<"  nn2 = "<<node2; while( nodo1> 0)
{ root_n1 = nodo1; nodo1 = padre
 [nodo1]; } while (nodo2> 0) { root_n2 =
nodo2; nodo2 = padre [nodo2]; } tribunal <<
" nrootn1 =" <<root_n1; tribunal << "
nrootn2 =" <<root_n2; if(root_n1!=root_n2)
{ insert_tree(tmp-> u, tmp-> v, tmp-> peso);
wt_tree = wt_tree + tmp-> peso; padre
[root_n2] = root_n1; } } } / * Fin de
make_tree () * / / * Inserción de una ventaja
en el árbol * / void insert_tree (int i, int j, int
peso) { tribunal << "
 nEste borde insertado en el árbol de
expansión  n"; count + +; árbol
[cuenta]. u = i; árbol [cuenta]. v = j;
[árbol cuenta]. peso = peso; } / * Fin de
insert_tree () * / / * Inserción de bordes
en la cola de prioridad * / insert_pque
(int i, j int, int peso) { borde * tmp, * q;
tmp = (borde *) malloc ( sizeof (borde));
tmp-> U = i; tmp-> v = j; tmp-> peso =
peso; / * la cola está vacía o borde que
se ha añadido peso inferior a primera
borde * /
 if (frente == NULL | | tmp-> peso <front->
peso) { tmp-> link = frente; frente = tmp; }
más { q = frente, mientras que (q-> enlace! =
NULL & & q-> enlace-> peso < = tmp-> peso)
q = q-> enlace; tmp-> link = q-> enlace; q->
link = tmp; si (q-> link == NULL) / * borde que
se añade al final * / tmp-> link = NULL; } } / *
Fin de insert_pque () * / / * Eliminar un borde
de la cola de prioridad * / * borde del_pque ()
{ borde * tmp; tmp = frente; cout << " nEdge
es procesada "; tribunal <<tmp-> u; cout <<"
-> "<<tmp-> V; cout <<" "<<tmp-> peso;
frente = frente-> enlace; return tmp; } / * Fin
de del_pque () * /
salida
VIDEO EXPLICACION
http://www.youtube.com/watch?v=AR_Y88kkh58

Kruskal

  • 2.
     Árbol demínima expansión: Árbol de máximo alcance cuyo valor es mínimo, es decir, la suma de sus aristas es mínima.
  • 3.
     Algoritmo deKruskal: El algoritmo de Kruskal permite hallar el árbol minimal de cualquier grafo valorado (con capacidades). Hay que seguir los siguientes pasos:  Se marca la arista con menor valor. Si hay más de una, se elige cualquiera de ellas.  De las aristas restantes, se marca la que tenga menor valor, si hay más de una, se elige cualquiera de ellas.
  • 4.
     Repetir elpaso 2 siempre que la arista elegida no forme un ciclo con las ya marcadas.  El proceso termina cuando tenemos todos los nodos del grafo en alguna de las aristas marcadas, es decir, cuando tenemos marcados n-1 arcos, siendo n el número de nodos del grafo.
  • 5.
    Ejemplo: Determinar elárbol de mínima expansión para el siguiente grafo: Siguiendo el algoritmo de Kruskal, tenemos: Elegimos, por ejemplo, la arista (5, 6) = 1 (menor valor) y la marcamos. Elegimos la siguiente arista con menor valor (1, 3) = 1 y la marcamos. Elegimos la siguiente arista con menor valor (5, 7) = 2 y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.
  • 6.
     Elegimos lasiguiente arista con menor valor (1, 2) = 3 y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.  Elegimos la siguiente arista con menor valor (6, 7) = 4 y la desechamos, ya que forma ciclos con las aristas (5, 7) y (5, 6) marcadas anteriormente.  Elegimos la siguiente arista con menor valor (2, 5) = 5 y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.  Elegimos la siguiente arista con menor valor (4, 5) = 6 y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.  FIN. Finalizamos dado que los 7 nodos del grafo están en alguna de las aristas, o también ya que tenemos marcadas 6 aristas (n-1).  Por tanto el árbol de mínima expansión resultante sería:
  • 7.
     <iostream.h> #include # include <process.h> <malloc.h> # include # define MAX 20 borde struct { int u, v int, int peso; borde * enlace; } * frente = NULL; int padre [ MAX]; / * Mantiene el padre de cada nodo * / árbol CODIGO Y PSEUDOCODIGO
  • 8.
  • 9.
     href="/index.php? option=com_glossary&Itemid=239&id=402&letter =E&lang=es" title="EDGE(Enhanced Data Rates for Global Evolution) – is an improved GPRS standard used to obtain rich content data. It broadcasted four times faster than conventional transmission. The speed of EDGE network depends upon various aspects, such as service outages, traffic volume, signal strength and the Internet speed. ">edge</a> [MAX]; / * contendrá los bordes del árbol de expansión * / int n; / * Indica el número total de nodos en el
  • 10.
     gráfico */ int wt_tree = 0; / * Peso del árbol de expansión * / int count = 0; / * Indica el número de aristas incluidas en el árbol * / / * Funciones * / void make_tree (); insert_tree (int i, j int, int peso); void insert_pque (int i, j int, int peso); borde * del_pque (); create_graph void (); void main () { int i; create_graph (); make_tree (); cout << "los bordes que se incluirán en el árbol de expansión se : n "; for (i = 1; i <= count; i + +) { tribunal <<árbol [i]. u; tribunal <<árbol [i]. V; } tribunal <<" Peso de este árbol de expansión mínima es: "<<wt_tree; } / * Fin de main () * / void create_graph ()
  • 11.
     { inti, en peso, max_edges, origen, destino; cout <<" Introduzca el número de nodos: "; cin>> n; max_edges * = n (n-1) / 2; for (i = 1; i <= max_edges; i + +) { tribunal << "Introduzca el borde" <<i << "(0 0 para dejar de fumar):" cin>> romper origen; cin>> destino; if ((origen == 0) & & (destino == 0)); cout << " n Introduzca el peso de este canto:" cin>> peso; if (origen> n | | Destin> n | | origen <= 0 | | destin <= 0) { tribunal << "no válido borde n"; i -; } más insert_pque (origen, destino, peso); } if (i <n - 1) { tribunal << " nSpanning árbol no es posible n"; salida (1); } } / * Fin de create_graph () * / void make_tree () { borde * tmp; int nodo1, nodo2,
  • 12.
     <img src="http://www.tech- faq.com/components/com_glossary /images/plugin/messagebox_info.p ng"border="0" align="top" alt="Glossary Link" />  <a class="glossarylink"
  • 13.
     href="/index.php? option=com_glossary&Itemid=239&id=240&lett er=R&lang=es" title="alsocalled the administrator account. Root refers to the user with the permission on every mode of a multi- user or single OS. The root in PC file structure is recognized as the top-most or the first directory within the chain of command. ">root</a>_n1, root_n2 while (count <n-1) / * bucle hasta n-1 aristas incluidas en el árbol * / tmp = { del_pque (); nodo1 = tmp-> u; nodo2 = tmp-> v; tribunal << " nn1 = "<<nodo1; cout <<" nn2 = "<<node2; while( nodo1> 0) { root_n1 = nodo1; nodo1 = padre
  • 14.
     [nodo1]; }while (nodo2> 0) { root_n2 = nodo2; nodo2 = padre [nodo2]; } tribunal << " nrootn1 =" <<root_n1; tribunal << " nrootn2 =" <<root_n2; if(root_n1!=root_n2) { insert_tree(tmp-> u, tmp-> v, tmp-> peso); wt_tree = wt_tree + tmp-> peso; padre [root_n2] = root_n1; } } } / * Fin de make_tree () * / / * Inserción de una ventaja en el árbol * / void insert_tree (int i, int j, int peso) { tribunal << "
  • 15.
     nEste bordeinsertado en el árbol de expansión n"; count + +; árbol [cuenta]. u = i; árbol [cuenta]. v = j; [árbol cuenta]. peso = peso; } / * Fin de insert_tree () * / / * Inserción de bordes en la cola de prioridad * / insert_pque (int i, j int, int peso) { borde * tmp, * q; tmp = (borde *) malloc ( sizeof (borde)); tmp-> U = i; tmp-> v = j; tmp-> peso = peso; / * la cola está vacía o borde que se ha añadido peso inferior a primera borde * /
  • 16.
     if (frente== NULL | | tmp-> peso <front-> peso) { tmp-> link = frente; frente = tmp; } más { q = frente, mientras que (q-> enlace! = NULL & & q-> enlace-> peso < = tmp-> peso) q = q-> enlace; tmp-> link = q-> enlace; q-> link = tmp; si (q-> link == NULL) / * borde que se añade al final * / tmp-> link = NULL; } } / * Fin de insert_pque () * / / * Eliminar un borde de la cola de prioridad * / * borde del_pque () { borde * tmp; tmp = frente; cout << " nEdge es procesada "; tribunal <<tmp-> u; cout <<" -> "<<tmp-> V; cout <<" "<<tmp-> peso; frente = frente-> enlace; return tmp; } / * Fin de del_pque () * /
  • 17.
  • 18.