Grafos es un tema muy útil para la informática y que ayuda a entender determinados problemas y estructuras de datos.
Definiciones elementales
Definición
Un grafo es un par G=(V,E) donde V es un conjunto finito de elementos
llamados vértices/nodos y E es un conjunto finito de elementos
llamados ejes/aristas.
Si los ejes son pares no ordenados de vértices de V, se dice un grafo no
dirigido.
Si los ejes son pares ordenados de vértices de V, se dice un grafo
dirigido / digrafo.
Si un vértice no está conectado a otro por ningún eje, se llama nodo
aislado.
Si un par de vértices están conectados por más de un eje, se llaman ejes
paralelos / múltiples.
Si un eje conecta un nodo con él mismo, se llama un lazo.
Los grafos se suelen representar con puntos para los nodos y líneas que los unen
representando los ejes.
El grafo anterior no es dirigido, tiene dos ejes paralelos entre A y B,
además de otros dos entre B y D. C tiene un lazo y E es un nodo aislado.
Y este es un grafo dirigido o, directamente, digrafo.
Definición
Un par de vértices son adyacentes / vecinos cuando existe un eje que los
conecta. Se dice que el eje incide sobre los vértices v1 y v2 si el
eje e={v1,v2} los conecta. En ese caso, v1 y v2 son los
extremos del eje e.
Definición
Sea G=(V,E) un grafo cualquiera.
∣V∣ es el orden del grafo G (número de vértices)
∣E∣ es el tamaño del grafo G (número de ejes)
El grado de un vértice
Definición
El grado de un vértice v, δ(v), es el número de ejes incidentes.
Por tanto,
δ(v)=0⟺v es aislado.
Además, se puede definir la sucesión de grados de un grafo G:
$$ {\big\\{ \delta(v) \big\\}}_{v \in V} $$
Lema del Apretón de Manos
Las suma de todos grados de los vértices es dos veces el número de ejes.
v∈V∑δ(v)=2∣E∣
Corolario
El número de vértices de grado impar, es par.
Según el Lema del Apretón de Manos, podemos poner la suma de todos los grados de
la siguiente forma:
El número de ejes (nnn) es la longitud del camino.
Un camino donde v=wv = wv=w (el vértice inicial es el vértice final) es un
camino cerrado / ciclo / circuito.
Un camino donde todos los ejes son distintos se llama camino simple.
Teorema
Sea GGG un grafo, ∣V∣=n|V| = n∣V∣=n, y AAA la matriz de adyacencia de GGG. El número de
caminos de longitud kkk que hay entre viv_ivi y vjv_jvj es la entrada aija_{i j}aij de
la matriz AkA^kAk.
Por tanto, hay 6 caminos de longitud 3 entre v1v_1v1 y v4v_4v4.
Conectividad de un grafo
Definición
Se dice que dos vértices vvv y www de un grafo están conectados si v=wv = wv=w o si
existe un camino entre ambos.
Definición
Un grafo es conexo si todos los vértices están unidos por un camino.
En otro caso, se llama disconexo o no conexo.
Ejemplo de un grafo disconexo:
Definición
Una componente conexa de un grafo es un subgrafo conexo maximal (de tamaño
máximo, es decir, que no está contenido en otro subgrafo conexo).
En el ejemplo anterior, se separaría en 2 componentes conexas:
Teorema
Un grafo es conexo ⟺\iff⟺ tiene 1 componente conexa.
Teorema
Sea un grafo GGG de orden nnn y AAA su matriz de adyacencia.
G es conexo ⟺\iff⟺ las entradas no diagonales (i≠ji \ne ji=j) de
∑i=1n−1Ai\displaystyle \sum_{i = 1}^{n - 1} A^ii=1∑n−1Ai son no nulas.
Grafos bipartitos
Definición
Sea G=(V,E)G = (V, E)G=(V,E) un grafo.
V=V1∪V2V = V_1 \cup V_2V=V1∪V2 con V1V_1V1 y V2V_2V2 disjuntos (V1∩V2=∅V_1 \cap V_2 = \emptyV1∩V2=∅) de
forma que no haya ejes que inciden en dos vértices de V1V_1V1 ni en dos vértices
de V2V_2V2, entonces, es un grafo bipartito.
Ejemplo:
Podemos tomar los conjuntos V1V_1V1 y V2V_2V2 como
Nótese que AAA no está conectado con DDD y que BBB no está conectado con CCC.
Definición
Un grafo bipartito se dice completo si todo vértice de V1V_1V1 está conectado
con V2V_2V2. Se denotan se la siguiente forma:
K∣V1∣,∣V2∣ K_{|V_1|, |V_2|} K∣V1∣,∣V2∣
Además se cumple que
Km,n≈Kn,mK_{m, n} \approx K_{n, m}Km,n≈Kn,m
∣V∣=m+n|V| = m + n∣V∣=m+n
∣E∣=mn|E| = mn∣E∣=mn
Ejemplos:
Teorema
Un grafo es bipartido ⟺\iff⟺ todos los ciclos tienen longitud par.
Ejemplos, el primero no es bipartito, pero sí el segundo.
En amarillo aparecen remarcados los ciclos que no son de longitud par (nótese
que solo es necesario encontrar un ciclo).
Se puede obtener la partición, esto es, los dos conjuntos diferenciados de
vértices, con el siguiente algoritmo:
Algoritmo
Tomamos un vértice vvv cualquiera.
V1:={w∈V|d(v,w) es impar}V_1 := \Set{ w \in V | d(v, w) \text{ es impar} }V1:={w∈V∣d(v,w) es impar}
V2:={w∈V|d(v,w) es par}V_2 := \Set{ w \in V | d(v, w) \text{ es par} }V2:={w∈V∣d(v,w) es par}
Donde d(a,b)d(a, b)d(a,b) es la distancia (longitud del camino más corto) entre los nodos aaa y bbb.
Grafos Eulerianos
Definición
En un grafo G=(V,E)G = (V, E)G=(V,E) se llama camino Euleriano a un camino simple (no se
repiten ejes) que contiene a todos los ejes del grafo.
Un circuito Euleriano es un camino Euleriano que emepieza y termina en el
mismo vértice. Todo grafo que tenga al menos un 1 circuito Euleriano se llama
grafo Euleriano.
Un grafo se llama Semieuleriano si no tiene un circuito Euleriano pero sí
un camino Euleriano.
Teorema
Un grafo conexo es Euleriano ⟺\iff⟺ todos los vértices tienen grado par:
∀v∈V,δ(v)≡0(mod2)\forall v \in V, \; \delta(v) \equiv 0 \pmod{2} ∀v∈V,δ(v)≡0(mod2)
Un grafo conexo es Semieuleriano ⟺\iff⟺ todos los vértices tienen grado par,
excepto dos: los nodos se salida y llegada.
Algunos ejemplos:
Observación
Kn,mK_{n,m}Kn,m es Euleriano ⟺\iff⟺nnn y mmm son pares.
K_n es Euleriano ⟺\iff⟺n≥3n \ge 3n≥3 y nnn es impar.
Algoritmo FLEURY
Definición
Un eje puente es un eje e={v,w}e = \Set{v, w}e={v,w} que al eliminarlo, el conjunto de
vértices que estén conectados con vvv y www sean disjuntos.
Véase un ejemplo:
Si se elimina el eje puente, el grafo resultante es no conexo:
El algorimo de FLEURY permite encontrar un camino Euleriano.
Algoritmo
Elegimos un vértice cualquiera, en el caso de Semieuleriano, se escoge uno de
grado impar.
Se recorre el grafo con las siguientes condiciones:
Cada eje se elimina una vez que fue recorrido, dado que es un camino
simple.
Solo se seleccionan los ejes puente si no hay otra opción.
Grafos Hamiltonianos
Definición
Un camino Hamiltoniano es un camino simple (no repite ejes) que contiene
a todos los vértices. No es necesario que pase por todos los ejes.
Si el camino es cerrado, se llama circuito Hamiltoniano.
Un grafo es Hamiltoniano si tiene un circuito Hamiltoniano (problema NP).
Un grafo es Semihamiltoniano si tiene un camino Hamiltoniano.
Condiciones suficientes
Teorema de DIRAC
Sea G=(V,E)G = (V, E)G=(V,E) un grafo conexo de orden n≥2n \ge 2n≥2.
∀v∈V,δ(v)≥n2⟹G es Hamiltoniano \forall v \in V, \quad \delta(v) \ge \frac{n}{2} \implies \text{G es Hamiltoniano} ∀v∈V,δ(v)≥2n⟹G es Hamiltoniano
Teorema de ORE
Sea G=(V,E)G = (V, E)G=(V,E) un grafo simple y conexo de orden n≥2n \ge 2n≥2.
δ(v)+δ(w)≥n⟹G es Hamiltoniano \delta(v) + \delta(w) \ge n \implies \text{G es Hamiltoniano} δ(v)+δ(w)≥n⟹G es Hamiltoniano
Para cualquier par de vértices no adyacentes.
Corolario
Kn,m es Hamiltoniano⟺m=n≠1 K_{n, m} \text{ es Hamiltoniano} \iff m = n \ne 1Kn,m es Hamiltoniano⟺m=n=1δ(v)=n−1⟹Kn es siempre Hamiltoniano \delta(v) = n - 1 \implies K_n \text{ es siempre Hamiltoniano} δ(v)=n−1⟹Kn es siempre Hamiltoniano
Condiciones necesarias
Teorema
Si G=(V,E)G = (V, E)G=(V,E) es un grafo Hamiltoniano, entonces para cada subconjunto UUU de
vértices (U⊂VU \subset VU⊂V) no nulo (U≠∅U \ne \emptyU=∅), el grafo G−UG - UG−U tiene como
mucho ∣U∣|U|∣U∣ componentes conexas.
En este ejemplo, ∣U∣=2|U| = 2∣U∣=2, pero G−UG -UG−U tiene 3 componentes conexas, por tanto,
no es Hamiltoniano.
Grafos planos
Definición
Un grafo es plano si se puede dibujar en el plano de manera que ningún par
de ejes se curce, solo en los vértices que inciden.
Como se puede ver en diagrama K4K_4K4 es plano, pero K5K_5K5 no.
Teorema de Kuratowski
Sea GGG un grafo simple y conexo.
GGG es plano ⟺\iff⟺ no contiene ningún subgrafo isomorfo por divisiones
elementales de K5K_5K5 o K3,3K_{3, 3}K3,3
Una subdivisión elemental es tomar un eje y añadir un vértice en el medio, sin
cambiar nada más (en el ejemplo se añade CCC en el medio de AAA y BBB):
Fórmula de Euler
Sea G=(V,E)G = (V, E)G=(V,E) un grafo plano, simple y conexo. Por tanto se cumple que
∣C∣+∣V∣=∣E∣+2 |C| + |V| = |E| + 2 ∣C∣+∣V∣=∣E∣+2
donde ∣C∣|C|∣C∣ es el número de caras o regiones cerradas del grafo.
Corolario
Sea G=(V,E)G = (V, E)G=(V,E) un grafo plano, simple y conexo.
Si ∣V∣≥3|V| \ge 3∣V∣≥3 y no tiene circuitos de longitud 3 ⟹∣E∣≤2∣V∣4\implies |E| \le 2 |V| 4⟹∣E∣≤2∣V∣4.
Grafos ponderados
Definición
Sea G=(V,E)G = (V, E)G=(V,E) un grafo.
Se dice que GGG es un grafo ponderado si existe una aplicación
w:E⟶R+∪{0}e⟼w(e)
\begin{align*}
w: E &\longrightarrow \R^{+} \cup \Set{0} \newline
e &\longmapsto w(e)
\end{align*}
w:Ee⟶R+∪{0}⟼w(e)
w(e)w(e)w(e) es el peso del eje.
Problema del viajante: encontrar un ciclo hamiltoniano de peso mínimo.
Algoritmo DIJKSTRA: calcular el camino más corto entre dos vértices.
Árboles
Definición
Un árbol es un grafo conexo y sin circuitos.
En este ejemplo, solo el grafo de la derecha es un árbol, porque el de la
izquierda tiene un ciclo (marcado en amarillo).
Teorema de DIRAC
Son equivalentes:
GGG es un árbol
Cada par de vértices está conectado por un único camino simple.
GGG es conexo y cada eje es un puente.
GGG es conexo y ∣V∣=∣E∣+1∣|V| = |E| + 1|∣V∣=∣E∣+1∣.
GGG no tiene ciclos y ∣V∣=∣E∣+1∣|V| = |E| + 1|∣V∣=∣E∣+1∣.
Árbol generador
Definición
Sea GGG un grafo conexo. Un árbol generador de GGG es un árbol TTT subgrafo de
GGG que contiene todos los vértices de GGG.
Definición
Un árbol generador de peso minimal es un árbol generador cuyo peso es
mínimo, el menor entre todos los generadores posibles del grafo.
Algoritmo de Prim (1957)
Algoritmo
Se elige un vértice cualquiera del grafo GGG: T0={v}T_0 = \Set{v}T0={v}
Se considera el conjunto de los ejes que inciden en todos los vértices del
árbol seleccionado. De todos ellos, se elige el de peso mínimo que no forme
un ciclo, siguiendo una estrategia voraz.
Se repite el paso 2 hasta que no se puedan añadir más ejes sin formar
ciclos.
Algoritmo de Kruskal (1956)
Algoritmo
Se pone un contador a 1 y se elige el eje de peso mínimo, e1e_1e1.
1≤i∣V∣−21 \le i |V| - 21≤i∣V∣−2, con ejes e1,e2,…eie_1, e_2, \ldots e_ie1,e2,…ei.
Se toma el eje $e_{i + 1} de peso mínimo entre todos los ejes restantes con
la condición de que no se formen ciclos.
Repetir el paso 2 hasta que no se puedan añadir más ejes.