2. Á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.
3. 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.
4. 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.
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 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:
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
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. { 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,
13. 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
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 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 * /
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 () * /