Algoritmos
Algoritmos
Algoritmos
Plantilla de clase que permite usar cualquier tipo de datos para los vértices ( V ) y los costos o pesos de las aristas
( C ).
C++
class Grafo {
private:
int numVertices;
vector<V> vertices;
vector<list<pair<V, C>>> listaAdyacencia;
vector<vector<C>> matrizAdyacencia;
map<V, map<V, C>> conjuntoAdyacencia;
public:
Grafo() : numVertices(0) {}
Grafo(int n) : numVertices(n);
ALGORITMOS EN GRAFOS
PARA GAFOS NO DIRIGIDOS
Algoritmo de Prim
El algoritmo de Prim y el algoritmo de Kruskal son utilizados para encontrar árboles de expansión mínima en un
grafo ponderado.
ALGORTIMO DE FLEURY'S
El Algoritmo de Fleury es un método utilizado en teoría de grafos para encontrar un ciclo euleriano en un grafo
Euleriano o un camino euleriano en un grafo Semi Euleriano. Este algoritmo se aplica a grafos no dirigidos y
proporciona una forma sistemática de recorrer todas las aristas del grafo exactamente una vez.
Algoritmo
Algoritmo de Borůvka
Otro enfoque para el problema del árbol de expansión mínima, se puede ejecutar en paralelo.
Algoritmo de Hierholzer
También encuentra un circuito euleriano, pero es más eficiente que el algoritmo de Fleury.
Uso de Dijkstra
Costos: A : 0, B : 3, C : 2, D : 5, E : 6
Algoritmo de Bellman-Ford**
Encuentra las rutas más cortas desde un nodo inicial a todos los otros nodos, puede manejar pesos negativos.
Algoritmo de Floyd-Warshall
El algoritmo de Floyd-Warshall encuentra todos los caminos más cortos entre todos los pares de vértices en
un grafo dirigido ponderado.
Implementación con matrices
Complejidad temporal y espacial
Variantes para grafos con pesos negativos
RECORRIDOS EN GRAFOS
RECORRIDOS DE BÚSQUEDA
Los dos recorridos más comunes son la búsqueda en anchura (BFS) y la búsqueda en profundidad (DFS).
Son algoritmos que visitan todos los vértices a aristas de un grafo de manera sistemática.
DFS (DEPTH FIRST SEARCH)
Método Recurrentemente
C++
while(!q.empty()){
int n = q.front();
q.pop();
if(marks[n])
continue;
marks[n] = true;
res.push_back(this->m_Vertices[n]);
BÚSQUEDA A* (A-STAR)
GRAFOS EULERIANOS
Un grafo Euleriano es un tipo de grafo que contiene un ciclo euleriano, es decir, un ciclo que recorre cada arista
exactamente una vez y regresa al punto de partida.
Un grafo Semi Euleriano es aquel que posee un camino euleriano, el cual recorre cada arista exactamente una
vez pero no necesariamente regresa al punto de partida.
CAMINO Y CICLO EULERIANO
GRAFOS DE HAMILTON
Un grafo de Hamilton es un tipo de grafo que contiene un ciclo de Hamilton, es decir, un ciclo que recorre cada
arista exactamente una vez y regresa al punto de partida.
Un grafo Semi Hamiltoniano es aquel que posee un camino de Hamilton, el cual recorre cada vértice
exactamente una vez pero no necesariamente regresa al vértice de partida.
CONDICIONES DE EXISTENCIA
Para que un grafo tenga un circuito de Hamilton, asumiendo un grafo G = (V , E) con más de 2 vértices. Es
necesario cumplir con ciertas condiciones:
1. Fuerza Bruta: Probar todas las combinaciones posibles de conexiones entre vértices, lo que es
computacionalmente costoso.
2. Backtracking: Comenzar desde un vértice y seleccionar conexiones hasta que no se pueda
avanzar. Si quedan vértices sin visitar, retroceder y probar otras opciones.
3. Algoritmos Aproximados: Utilizar algoritmos basados en el problema del vendedor viajero, como
Cheapest Link Algorithm (CLA), Nearest Neighbor Algorithm (NNA), y Repetitive Nearest Neighbor
Algorithm (RNNA), que ofrecen soluciones cercanas al óptimo.
IMPLEMENTACIÓN DE GRAFOS
Hay varias formas de implementar grafos, incluyendo matrices de adyacencia, lista de adyacencia y matrices de
incidencia.
MATRIZ DE ADYACENCIA
Para un Grafo una matriz de adyacencia es una forma de representar un grafo como una matriz booleana (0 y 1).
Para un grafo no dirigido, Supongamos que hay n Para un grafo dirigido, la matriz de adyacencia es
vértices en el grafo. Entonces, crea una matriz 2D una matriz simétrica: a = a
i,j j,i
LISTA DE ADYACENCIA
No dirigido Dirigido
V = {A, B, C, D, E}
CONJUNTO DE ADYACENCIA O ARISTAS
V = {A, B, C, D, E}
Lista de Adyacencia
Uso: Eficiente en términos de espacio para grafos dispersos. Útil para iterar sobre los vecinos de un
vértice.
Estructura: Vector de listas, donde cada lista contiene pares (vértice adyacente, costo).
Matriz de Adyacencia
Uso: Eficiente para grafos densos donde se necesita acceso rápido para verificar la existencia de aristas.
Estructura: Vector de vectores, formando una matriz N x N, donde cada celda [i][j] representa el
costo de la arista desde i hasta j .
Conjunto de Adyacencia
Uso: Combina ventajas de listas y matrices, eficiente tanto en tiempo como en espacio para ciertos tipos
de operaciones. útil para acceso rápido a los vecinos y costos de aristas.
Estructura: Mapa de mapas, donde el primer mapa asocia vertices de origen a otros mapas que asocia
vértices de destino con costos.