Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Verificador de grafo bipartito
Comprueba si el grafo admite una coloración con dos colores, es decir si carece de ciclos impares
Selecciona un algoritmo y genera pasos para comenzar la visualización
Un grafo es bipartito cuando sus vértices pueden dividirse en dos grupos con cada arista cruzando entre los grupos, nunca dentro de uno. Comprobar la bipartición equivale a probar si el grafo puede colorearse con dos colores, o si no contiene ningún ciclo de longitud impar.
Un recorrido BFS o DFS colorea el grafo con dos colores sobre la marcha: colorear el vértice inicial y dar a cada vecino descubierto el color opuesto. Si una arista conecta alguna vez dos vértices del mismo color, existe un ciclo impar y el grafo no es bipartito. Debe comprobarse cada componente. La prueba se ejecuta en O(V + E).
La estructura bipartita sustenta los problemas de emparejamiento: asignar estudiantes a escuelas, trabajos a máquinas y pasajeros a conductores. Los sistemas de recomendación modelan usuarios y artículos como los dos lados de un grafo bipartito. La caracterización por ciclos impares es un calentamiento de entrevista frecuente que conduce a temas de emparejamiento máximo.
Un grafo es bipartito exactamente cuando puede colorearse con dos colores. Así que la prueba es un recorrido que colorea cada vértice del color opuesto a su padre y vigila si aparece un choque.
esBipartito(grafo):
color = {} para todos los vértices
para cada vértice s sin color: // cada componente
color[s] = 0
cola = [s]
mientras la cola no esté vacía:
u = cola.sacar()
para cada vecino v de u:
si v no tiene color:
color[v] = 1 - color[u]
cola.meter(v)
si no, si color[v] == color[u]:
devolver falso // ciclo impar
devolver verdaderoEl choque no es una señal arbitraria de fallo, es una demostración. Si dos vértices adyacentes reciben el mismo color, los caminos del árbol desde ambos hasta su antecesor común más la arista que los conecta forman un ciclo de longitud impar. Los grafos bipartitos son exactamente los grafos sin ciclos impares, así que la arista en conflicto es un certificado que puedes devolver al llamante.
Colorea con dos colores un ciclo de cuatro vértices, después añade una cuerda y observa cómo el mismo recorrido lo rechaza.
Grafo de ejemplo: Primero un ciclo de 4 con A-B, B-C, C-D, D-A. Después el mismo grafo con la cuerda A-C añadida.
El ciclo de 4 es bipartito con las partes {A, C} y {B, D}; añadir la cuerda A-C lo hace no bipartito, y se detecta en la arista B-C. Fíjate en la regla general que ilustra: todo ciclo par es bipartito y todo ciclo impar no lo es, así que la longitud del ciclo por sí sola lo decide. Fíjate también en que el conflicto se informó en la arista B-C y no en la propia cuerda, lo cual es normal, ya que el algoritmo informa donde la contradicción aflora primero, no donde tú echarías la culpa.
Tiempo: O(V + E) · Espacio: O(V)
Esto es un único BFS o DFS con una comparación por arista, así que cuesta exactamente un recorrido. Cada vértice se colorea una vez y cada arista se inspecciona una vez desde cada extremo. El espacio es un color por vértice más la cola o la pila de recursión, ambos O(V). El bucle sobre todos los vértices no añade nada asintóticamente y es lo que hace que funcionen los grafos desconectados. No hay ningún enfoque más rápido, ya que decidir la bipartición requiere mirar cada arista: una sola arista sin examinar podría ser la que crea un ciclo impar.
La bipartición suele ser una condición previa más que un objetivo. Lo que hagas después depende de por qué preguntaste.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Hopcroft-Karp | El grafo es bipartito y ahora quieres un emparejamiento máximo entre las dos partes. | O(E·sqrt(V)) |
| Coloración de grafos | El grafo no es bipartito y necesitas el número cromático real, que será 3 o más. | NP-difícil en general |
| Detección de ciclos impares | Quieres el ciclo culpable en sí, no un simple sí o no. Se reconstruye desde los punteros al padre del BFS en la arista del conflicto. | O(V + E) |
| Union-Find con paridad | Las aristas llegan de forma incremental y quieres rechazar la primera que rompe la bipartición en cuanto se añade. | O(E·α(V)) |
Algoritmos relacionados: Búsqueda en Anchura, Coloración de Grafos, Flujo Máximo