-
Notifications
You must be signed in to change notification settings - Fork 0
Semanas 11 y 12 Grafos
Reconocer representaciones de grafos, elegir entre DFS/BFS, detectar ciclos y modelar componentes conectados con seguridad.
| Problema | Patrón | Función | Tests |
|---|---|---|---|
| Number of Islands | DFS en matriz | number_of_islands |
2 |
| Max Area of Island | DFS en matriz | max_area_of_island |
2 |
| Pacific Atlantic Water Flow | BFS inverso desde bordes | pacific_atlantic |
2 |
| Rotting Oranges | BFS multisource | oranges_rotting |
2 |
| Walls and Gates | BFS multisource | walls_and_gates |
2 |
| Course Schedule | Ordenamiento topológico | can_finish |
2 |
| Course Schedule II | Ordenamiento topológico | find_course_order |
2 |
| Redundant Connection | Union Find | redundant_connection |
2 |
| Number of Connected Components | Union Find | count_connected_components |
2 |
| Graph Valid Tree | Union Find | graph_valid_tree |
2 |
| Is Graph Bipartite | BFS con coloreo | is_bipartite |
2 |
| Number of Provinces | Union Find en matriz | find_circle_num |
2 |
| Accounts Merge | Componentes conectados | accounts_merge |
2 |
| Clone Graph | BFS en lista de adyacencia | clone_graph |
2 |
Se usa para consumir componentes conectados celda por celda.
Invariante:
- Solo se visita una celda si está dentro de límites, no ha sido visitada y cumple la condición del problema.
Se usa cuando varios puntos iniciales se expanden al mismo tiempo.
Ejemplos:
- Naranjas podridas.
- Habitaciones y puertas.
Invariante:
- La primera vez que una celda se visita, ya se encontró su distancia mínima desde alguna fuente.
En Pacific Atlantic, buscar desde cada celda hacia océanos es costoso. La inversión útil es iniciar desde los bordes y moverse hacia alturas mayores o iguales.
Invariante:
- Si desde un borde puedo subir hasta una celda, entonces desde esa celda se puede bajar hasta ese borde.
Kahn usa indegrees:
- Cursos con indegree
0no tienen prerequisitos pendientes. - Al tomar un curso, se reduce el indegree de sus vecinos.
- Si no se procesan todos los cursos, existe un ciclo.
Se usa para conectar componentes y detectar si una arista une nodos que ya estaban conectados.
Invariante:
-
find(x)devuelve el representante actual de la componente. -
union(a, b)devuelve falso cuandoaybya comparten representante. - Para contar componentes, cada unión exitosa reduce el total de grupos en uno.
- Para validar un árbol, deben cumplirse dos condiciones:
n - 1aristas y ninguna unión redundante. - Para provincias, la matriz de adyacencia se recorre como grafo no dirigido.
Se usa para verificar si un grafo puede separarse en dos grupos sin que una arista conecte nodos del mismo grupo.
Invariante:
- Cada vecino debe tener el color opuesto al nodo actual.
- Si aparece una arista entre nodos del mismo color, el grafo no es bipartito.
Matrices:
Vec<Vec<i32>>Listas de adyacencia:
Vec<Vec<usize>>Grafos etiquetados:
HashMap<String, Vec<String>>- Marcar visitado demasiado tarde y meter la misma celda varias veces a la cola.
- Confundir BFS multisource con correr BFS desde cada fuente.
- En Pacific Atlantic, moverse en la dirección equivocada al invertir la búsqueda.
- Olvidar que un ciclo en prerequisitos deja nodos sin procesar.
- En Union Find, no comprimir caminos y degradar rendimiento en casos grandes.
- En grafos bipartitos, olvidar reiniciar BFS desde componentes desconectadas.
cargo testResultado al cerrar el bloque:
367 passed; 0 failed
El siguiente bloque recomendado es:
- Montículos.
- Intervalos.
- Greedy.
Primeros problemas sugeridos:
- Kth Largest Element in an Array.
- Find Median from Data Stream.
- Merge Intervals.
- Insert Interval.
- Meeting Rooms II.