Trabajo N° 5 Algoritmos Voraces
Los algoritmos voraces, ávidos o de avance rápido se utilizan normalmente en problemas de optimización. 1. Maricielo Nestares Flores 2. Luis Enrique Sigueñas Arango
Algoritmo De Kruskal (árbol de expansión mínima) El algoritmo de kruskal es un algoritmo de recubrimiento minimo conexo ponderado, o sea que va unir todos los nodos ormando un árbol, tomando la aristas que tengan un peso que siempre sea menor! Este árbol de un grao es un subgrao que contiene todos sus v"rtices o nodos! #n grao puede tener m$ltiples árboles! %or e&emplo, un grao completo de cuatro nodos (todos relacionadoscon todos) tendría ' árboles! El algoritmo se basa en una propiedad clave de los árboles que permite estar seguros de si un arcodebe pertenecer al árbol o no, usar esta propiedad para seleccionar cada arco! *ótese en el algoritmo,que siempre que se a+ade un arco (u,v), "ste será siempre la conexión más corta (menor coste)alcanable desde el nodo u al resto del grao -! Así que por deinición "ste deberá ser parte del árbol! Este algoritmo es de tipo vora (tambi"n llamado greed) a que a cada paso, "ste selecciona el arco más barato lo a+ade al subgrao! Este tipo de algoritmos pueden no uncionar para resolver otro tipo de problemas, por e&emplo para encontrar la ruta más corta entre los nodos a b! .A/A.0E/1203.A2 •
Algoritmo basado en las aristas
•
Agregar las aristas , uno a la ve, en orden de peso creciente
•
•
El algoritmo mantiene A 4 un bosque de árboles! #na arista es aceptada si se conecta v"rtices de distintos árboles *ecesitamos una estructura de datos que mantiene una partición, es decir ,a colección de con&untos dis&untos
CODIO #include
#include #include #include #include #include #de!ne ii pair using namespace std" vector pset" vector >grao" void init$et%int size& ' int i" pset.resize%size&" or%i()"i
sort%grao.begin%&,grao.end%&&" or%i()"iau3(grao+i" i%4is$ame$et%au3.second.!rst,au3.second.second&& ' cout<<5pasa en/ 5<>A" cout<<5ingrese numero de vertices5<>V" cout<<5ingrese desde 8ue vertice a 8ue vertice/ 5<>a" cout<<5al vertice/ 5"cin>>b" cout<<5su peso/ 5" cin>>6" grao.pus:bac%pair%6,ii%a,b&&&" rusal%V&" getc%&" return )" s;stem%5A=$5&" -
Eje!"lo #e Caso ?enemos un grao como observamos las aristas son los conectores entre 2 v@rtices o nodos %enumeradas del 1 al &, estas contienen un peso. 1. legimos al de menor peso, en este caso al 2B.
2. scogemos el 8ue sigue en orden de menor peso de los restantes continuamente %2C,B1,B2,DE,FD&, evitando 8ue se creen ciclos.
B. n este caso no podemos tomar la arista %2,B& pues se crearGa un ciclo entre los nodos 2, B ; F.
D. or lo cual pasamos al pró3imo menor, 8ue no orme un ciclo., en este caso el HH.
F. Iinalmente se an unido los v@rtices, sin ormar un ciclo en las aristas.
Eje!"lo en el Co#igo
rimero ingresamos la cantidad de v@rtices %nodos& ; aristas $eguidamente por los valores entre ellos
Luego vemos los resultados.