Algoritmos y Estructuras de Datos Compiladores e Intérpretes Herramientas Lenguaje de programación
!Prog C/C++
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Redes y Computación Distribuida Sistemas Operativos

Teoría de Grafos

[date: 02-07-2023] [last modification: 08-07-2023]
[words: 3594] [reading time: 17min] [size: 78898 bytes]

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)G = (V, E) donde VV es un conjunto finito de elementos llamados vértices/nodos y EE es un conjunto finito de elementos llamados ejes/aristas.

Los grafos se suelen representar con puntos para los nodos y líneas que los unen representando los ejes.

Eje paralelo
Eje paralelo
Eje paralelo
Eje paralelo
Lazo
A
B
C
D
E

El grafo anterior no es dirigido, tiene dos ejes paralelos entre AA y BB, además de otros dos entre BB y DD. CC tiene un lazo y EE es un nodo aislado.

A
B
C
D

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 v1v_1 y v2v_2 si el eje e={v1,v2}e = \Set{v_1, v_2} los conecta. En ese caso, v1v_1 y v2v_2 son los extremos del eje ee.
Definición

Sea G=(V,E)G = (V, E) un grafo cualquiera.

  • V|V| es el orden del grafo GG (número de vértices)
  • E|E| es el tamaño del grafo GG (número de ejes)

El grado de un vértice

Definición
El grado de un vértice vv, δ(v)\delta(v), es el número de ejes incidentes.

Por tanto,

δ(v)=0    v es aislado. \delta(v) = 0 \iff v \text{ es aislado.}

Además, se puede definir la sucesión de grados de un grafo GG:

$$ {\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.

vVδ(v)=2E \sum_{v \in V} \delta(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:

v2V2δ(v2)Siempre par+v1V1δ(v1)???=2ESiempre par \overbrace{\sum_{v_2 \in V_2} \delta(v_2)}^{\text{Siempre par}} + \overbrace{\sum_{v_1 \in V_1} \delta(v_1)}^{\text{???}} = \overbrace{2 |E|}^{\text{Siempre par}}

Por tanto, ?????? tiene que ser impar.

Donde V2V_2 es el conjunto de los vértices de grado par y V1V_1 los vértices de grado impar.

Grafos simples

Definición
Un grafo se llama simple si no tiene lazos ni ejes paralelos.

Varios ejemplos de grafos simples:

A
B
C
D
A
B
C
D
A
B
C
D

Si un grafo es simple, entonces

vV,0δ(v)V1 \forall v \in V, \quad 0 \le \delta(v) \le |V| - 1
Definición
Si un grafo es simple y todos los vértices tienen el mismo grado rr, entonces el grafo es rr-regular.
A
0-regular
A
B
1-regular
A
B
C
2-regular
A
B
C
D
3-regular

Subtipos de grafos simples:

Operaciones con grafos

Subgrafos

Definición

Sean G=(V,E)G = (V, E) y G=(V,E)G’ = (V’, E’) dos grafos.

Si VVV’ \subset V y EEE’ \subset E,     \implies GG’ es un subgrafo de GG.

Por ejemplo,

GG'

Resta de grafos

Definición

Sea G=(V,E)G = (V, E) un grafo y UVU \subset V, UU \ne \empty.

Sea GUG - U el subgrafo de GG que se obtiene al eliminar los vértices UU del grafo GG (y los ejes incidentes).

Por ejemplo,

GG'

Isomorfismo de grafos

Definición

Sean G=(V,E)G = (V, E) y G=(V,E)G’ = (V’, E’) dos grafos.

Se dice que GG y GG’ son isomorfos si existen las aplicaciones biyectivas

φ:VVψ:EE \begin{align*} \varphi : V &\longrightarrow V' \newline \psi : E &\longrightarrow E' \end{align*}

de forma que se cumpla

e={vi,vj}E    ψ(e)={φ(vi),;φ(vj)}E \allowbreak e = \Set{v_i, v_j} \in E \iff \psi(e) = \Set{\varphi(v_i), \\; \varphi(v_j)} \in E'

Es decir, que se mantenga la incidencia entre los mismos nodos.

Importante
Determinar si dos grafos son isomorfos es un problema NP.
Definición
Las invariantes son propiedades que se conservan entre dos grafos isomorfos y que pueden ayudar a determinar si lo son o no.

Ejemplos de algunos invariantes son:

Representación de grafos

Tabla de adyacencia

En una columna se colocan todos los vértices y en la otra se listan todos los vértices que están conectados con él.

Por ejemplo, la tabla de adyacencia siguiente:

GVérticevvvvs1234Vvvvvé2111rtvi3cevs4adyacentes

Corresponde con este grafo:

G
v2
v1
v3
v4

Matriz de adyacencia

Definición
La matriz de adyacencia de un grafo GG es una matriz de orden V×V|V| \times |V|, AG=(aij)A_G = (a_{i j}) donde aija_{i j} es el número de ejes que conectan el vértice viv_i con vjv_j.

La matriz de adyacencia del grafo anterior sería la siguiente:

AG=(0111100010001000) A_G = \begin{pmatrix} \newline 0 & 1 & 1 & 1 \newline 1 & 0 & 0 & 0 \newline 1 & 0 & 0 & 0 \newline 1 & 0 & 0 & 0 \end{pmatrix}

Otro ejemplo:

AG=(0211120001101101010111010) A_{G'} = \begin{pmatrix} \newline 0 & 2 & 1 & 1 & 1 \newline 2 & 0 & 0 & 0 & 1 \newline 1 & 0 & 1 & 1 & 0 \newline 1 & 0 & 1 & 0 & 1 \newline 1 & 1 & 0 & 1 & 0 \end{pmatrix}
A
B
C
D
E
G'
Observación
Las matrices de adyacencia para grafos no dirigidos siempre son simétricas, dado que un eje conecta vértices en los dos sentidos.
Observación
Si el grafo es simple, la matriz será binaria con 0s en la diagonal.
Observación

La suma de la fila o columna (contando dos veces la diagonal) es el grado del vértice.

2aii+jiaij=δ(vi)=2aii+kiaki 2a_{i i} + \sum_{j \ne i} a_{i j} = \delta(v_i) = 2a_{i i} + \sum_{k \ne i} a_{k i}

Matriz de incidencia

Definición

La matriz de incidencia de un grafo GG es una matriz de orden E×V|E| \times |V|, CG=(cij)C_G = (c_{i j}) donde

cij={1Si vi es incidente con vj0En otro caso c_{i j} = \begin{cases} 1 \qquad \text{Si viv_i es incidente con vjv_j} \newline 0 \qquad \text{En otro caso} \newline \end{cases}

(siempre es una matriz binaria)

La matriz de incidencia para GG es

(111100001010) \begin{pmatrix} \newline 1 & 1 & 1 \newline 1 & 0 & 0 \newline 0 & 0 & 1 \newline 0 & 1 & 0 \end{pmatrix}

Caminos de un grafo

Definición

Sea G=(V,E)G = (V, E) un grafo.

Un camino o trayectoria de un vértice vv a otro ww es una secuencia de ejes de GG (no necesariamente distintos) de la forma

e1={v,v1},;e2={v1,v2},;,;en={vn,w} e_1 = \Set{v, v_1}, \\; e_2 = \Set{v_1, v_2}, \\; \ldots, \\; e_n = \Set{v_n, w}
Teorema
Sea GG un grafo, V=n|V| = n, y AA la matriz de adyacencia de GG. El número de caminos de longitud kk que hay entre viv_i y vjv_j es la entrada aija_{i j} de la matriz AkA^k.

Ejemplo:

v1
v4
v3
v2

Y la matriz de incidencia:

A=(0001011101121120)    A3=(033631013123131618612189) A = \begin{pmatrix} \newline 0 & 0 & 0 & 1 \newline 0 & 1 & 1 & 1 \newline 0 & 1 & 1 & 2 \newline 1 & 1 & 2 & 0 \newline \end{pmatrix} \implies A^3 = \begin{pmatrix} \newline 0 & 3 & 3 & 6 \newline 3 & 10 & 13 & 12 \newline 3 & 13 & 16 & 18 \newline \textcolor{#f05}{6} & 12 & 18 & 9 \end{pmatrix}

Por tanto, hay 6 caminos de longitud 3 entre v1v_1 y v4v_4.

Conectividad de un grafo

Definición
Se dice que dos vértices vv y ww de un grafo están conectados si v=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:

A
B
C
D
E
F
G
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:

Componente conexa 1
B
A
C
Componente conexa 2
E
D
F
G
Teorema
Un grafo es conexo     \iff tiene 1 componente conexa.
Teorema

Sea un grafo GG de orden nn y AA su matriz de adyacencia.

G es conexo     \iff las entradas no diagonales (iji \ne j) de i=1n1Ai\displaystyle \sum_{i = 1}^{n - 1} A^i son no nulas.

Grafos bipartitos

Definición

Sea G=(V,E)G = (V, E) un grafo.

V=V1V2V = V_1 \cup V_2 con V1V_1 y V2V_2 disjuntos (V1V2=V_1 \cap V_2 = \empty) de forma que no haya ejes que inciden en dos vértices de V1V_1 ni en dos vértices de V2V_2, entonces, es un grafo bipartito.

Ejemplo:

A
B
C
D

Podemos tomar los conjuntos V1V_1 y V2V_2 como

V1={A,D}V2={B,C} \begin{align*} V_1 &= \Set{A, D} \newline V_2 &= \Set{B, C} \end{align*}

Nótese que AA no está conectado con DD y que BB no está conectado con CC.

Definición

Un grafo bipartito se dice completo si todo vértice de V1V_1 está conectado con V2V_2. Se denotan se la siguiente forma:

KV1,V2 K_{|V_1|, |V_2|}

Además se cumple que

Ejemplos:

K1,1K1,2K2,2K2,3K3,3
Teorema
Un grafo es bipartido     \iff todos los ciclos tienen longitud par.

Ejemplos, el primero no es bipartito, pero sí el segundo.

A
B
C
D
E
F
A
B
C
D
E

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
  1. Tomamos un vértice vv cualquiera.
  2. V1:={wV  |  d(v,w) es impar}V_1 := \Set{ w \in V | d(v, w) \text{ es impar} }
  3. V2:={wV  |  d(v,w) es par}V_2 := \Set{ w \in V | d(v, w) \text{ es par} }

Donde d(a,b)d(a, b) es la distancia (longitud del camino más corto) entre los nodos aa y bb.

Grafos Eulerianos

Definición
En un grafo 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.
Teorema

Un grafo conexo es Euleriano     \iff todos los vértices tienen grado par: vV,  δ(v)0(mod2)\forall v \in V, \; \delta(v) \equiv 0 \pmod{2}

Un grafo conexo es Semieuleriano     \iff todos los vértices tienen grado par, excepto dos: los nodos se salida y llegada.

Algunos ejemplos:

EulerianoSemieulerianoNohaycaminosEulerianos
Observación

Kn,mK_{n,m} es Euleriano     \iff nn y mm son pares.

K_n es Euleriano     \iff n3n \ge 3 y nn es impar.

Algoritmo FLEURY

Definición
Un eje puente es un eje e={v,w}e = \Set{v, w} que al eliminarlo, el conjunto de vértices que estén conectados con vv y ww sean disjuntos.

Véase un ejemplo:

Eje puente
a
b
v
w
c
d
e

Si se elimina el eje puente, el grafo resultante es no conexo:

a
b
v
c
w
d
e

El algorimo de FLEURY permite encontrar un camino Euleriano.

Algoritmo
  1. Elegimos un vértice cualquiera, en el caso de Semieuleriano, se escoge uno de grado impar.

  2. 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.

Condiciones suficientes

Teorema de DIRAC

Sea G=(V,E)G = (V, E) un grafo conexo de orden n2n \ge 2.

vV,δ(v)n2    G es Hamiltoniano \forall v \in V, \quad \delta(v) \ge \frac{n}{2} \implies \text{G es Hamiltoniano}
Teorema de ORE

Sea G=(V,E)G = (V, E) un grafo simple y conexo de orden n2n \ge 2.

δ(v)+δ(w)n    G es Hamiltoniano \delta(v) + \delta(w) \ge n \implies \text{G es Hamiltoniano}

Para cualquier par de vértices no adyacentes.

Corolario
Kn,m es Hamiltoniano    m=n1 K_{n, m} \text{ es Hamiltoniano} \iff m = n \ne 1 δ(v)=n1    Kn es siempre Hamiltoniano \delta(v) = n - 1 \implies K_n \text{ es siempre Hamiltoniano}

Condiciones necesarias

Teorema
Si G=(V,E)G = (V, E) es un grafo Hamiltoniano, entonces para cada subconjunto UU de vértices (UVU \subset V) no nulo (UU \ne \empty), el grafo GUG - U tiene como mucho U|U| componentes conexas.
adGebcU={a,c}dG-eUb

En este ejemplo, U=2|U| = 2, pero GUG -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.
A
B
C
D
K4
A
B
C
C
E
K5

Como se puede ver en diagrama K4K_4 es plano, pero K5K_5 no.

Teorema de Kuratowski

Sea GG un grafo simple y conexo.

GG es plano     \iff no contiene ningún subgrafo isomorfo por divisiones elementales de K5K_5 o K3,3K_{3, 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 CC en el medio de AA y BB):

A
B
A
C
B
Fórmula de Euler

Sea 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

donde C|C| es el número de caras o regiones cerradas del grafo.

Corolario

Sea G=(V,E)G = (V, E) un grafo plano, simple y conexo.

  • V3    E3V6 |V| \ge 3 \implies |E| \le 3 |V| - 6 .
  • GG tiene un vértice de grado 5\ge 5.
  • Si V3|V| \ge 3 y no tiene circuitos de longitud 3     E2V4\implies |E| \le 2 |V| 4.

Grafos ponderados

Definición

Sea G=(V,E)G = (V, E) un grafo.

Se dice que GG es un grafo ponderado si existe una aplicación

w:ER+{0}ew(e) \begin{align*} w: E &\longrightarrow \R^{+} \cup \Set{0} \newline e &\longmapsto w(e) \end{align*}

w(e)w(e) es el peso del eje.

5
3
7
2
3
4
A
B
C
D
E

Árboles

Definición
Un árbol es un grafo conexo y sin circuitos.
A
B
C
D
E
F
A
B
C
D
E
F
G
H
I

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:

  • GG es un árbol
  • Cada par de vértices está conectado por un único camino simple.
  • GG es conexo y cada eje es un puente.
  • GG es conexo y V=E+1|V| = |E| + 1|.
  • GG no tiene ciclos y V=E+1|V| = |E| + 1|.

Árbol generador

Definición
Sea GG un grafo conexo. Un árbol generador de GG es un árbol TT subgrafo de GG que contiene todos los vértices de GG.
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
  1. Se elige un vértice cualquiera del grafo GG: T0={v}T_0 = \Set{v}
  2. 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.
  3. Se repite el paso 2 hasta que no se puedan añadir más ejes sin formar ciclos.

Algoritmo de Kruskal (1956)

Algoritmo
  1. Se pone un contador a 1 y se elige el eje de peso mínimo, e1e_1.
  2. 1iV21 \le i |V| - 2, con ejes e1,e2,eie_1, e_2, \ldots e_i. 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.
  3. Repetir el paso 2 hasta que no se puedan añadir más ejes.
Anterior: Recursividad Volver a Mates Discretas