Álgebra y Matemática Discreta - 2012 Sesión de Prácticas 4
Leandro Marín
Dpto. de Matemática Aplicada Facultad de Informática
1 Familias de Grafos
2 Grafos Eulerianos y Hamiltonianos
3 Coloraciones
Grafos Completos K
nPodemos definir G = graphs.CompleteGraph(5)para obtener:
0
1
2 3
Grafos Bipartidos Completos K
r,sPodemos definir G = graphs.CompleteBipartiteGraph(3,3)
para obtener:
0 1 2
Sólidos Platónicos
Sólidos Platónicos
El tetraedro G = graphs.TetrahedralGraph
Sólidos Platónicos
El tetraedro G = graphs.TetrahedralGraph
El octaedro G = graphs.OctahedralGraph
Sólidos Platónicos
El tetraedro G = graphs.TetrahedralGraph
El octaedro G = graphs.OctahedralGraph
El hexaedro G = graphs.HexahedralGraph
Sólidos Platónicos
El tetraedro G = graphs.TetrahedralGraph El octaedro G = graphs.OctahedralGraph El hexaedro G = graphs.HexahedralGraph El dodecaedro G = graphs.DodecahedralGraph El icosaedro G = graphs.IcosahedralGraphGrafos Eulerianos
Un grafo G es euleriano si y solo si tiene un camino cerrado euleriano.
Grafos Eulerianos
Un grafo G es euleriano si y solo si tiene un camino cerrado euleriano.
Es decir, un camino cerrado que pase por todas las aristas sin repetir ninguna.
Grafos Eulerianos
Un grafo G es euleriano si y solo si tiene un camino cerrado euleriano.
Es decir, un camino cerrado que pase por todas las aristas sin repetir ninguna.
Para comprobar si un grafo es euleriano, basta con ver que es conexo y todos sus vértices son de grado par.
Grafos Eulerianos
Un grafo G es euleriano si y solo si tiene un camino cerrado euleriano.
Es decir, un camino cerrado que pase por todas las aristas sin repetir ninguna.
Para comprobar si un grafo es euleriano, basta con ver que es conexo y todos sus vértices son de grado par.
Podemos verlo directamente con el comando G.is_eulerian()
Escribamos el siguiente código:
G = graphs . P e t e r s e n G r a p h () G . i s _ c o n n e c t e d ()
G . degree () G . i s _ e u l e r i a n ()
El grafo de Petersen es el siguiente: 0 1 2 3 4 5 6 7 8 9
Vamos ahora a introducir uno que sí es euleriano: G = Graph () G . a d d _ v e r t i c e s (range( 6 ) ) G . a d d _ e d g e s ([(0 , 2 ) ,(0 , 1 ) ,(1 , 2 ) ,(1 , 3 ) ,(1 , 4 ) ,(2 , 3 ) ,(2 , 4 ) ,(3 , 4 ) ,(3 , 5 ) ,(4 , 5 )]) G . i s _ c o n n e c t e d () G . degree () G . i s _ e u l e r i a n ()
Este grafo es el mismo que hemos visto en clase: 0 1 2 3 4 5
Caminos Eulerianos
Pueden existir multitud de caminos eulerianos cuando el grafo es euleriano.
Caminos Eulerianos
Pueden existir multitud de caminos eulerianos cuando el grafo es euleriano.
Lo importante es saber saber los sentidos de recorrido que tenemos que hacer, pero luego podemos recorrer cada ciclo por separado.
Caminos Eulerianos
Pueden existir multitud de caminos eulerianos cuando el grafo es euleriano.
Lo importante es saber saber los sentidos de recorrido que tenemos que hacer, pero luego podemos recorrer cada ciclo por separado.
sagenos calcula las soluciones dándonos la orientación del recorrido, que es un grafo dirigido:
E = G . e u l e r i a n _ o r i e n t a t i o n () E . show ()
Nos proporciona la orientación del grafo que nos indica el sentido de recorrido: 0 1 2 3 4 5
Grafos Hamiltonianos
Grafos Hamiltonianos
Un grafo es Hamiltoniano si tiene un ciclo hamiltoniano. Es decir, un ciclo que recorre todos los vértices pasando una única vez por cada vértice.
Grafos Hamiltonianos
Un grafo es Hamiltoniano si tiene un ciclo hamiltoniano. Es decir, un ciclo que recorre todos los vértices pasando una única vez por cada vértice.
Se puede saber si un grafo es hamiltoniano en sage con el comando G.is_hamiltonian()
Escribamos el siguiente código:
G = graphs . C u b e G r a p h ( 3 ) G . i s _ h a m i l t o n i a n ()
Este es el cubo tridimensional, que nos dirá que sí es hamiltoniano y si le pedimos el ciclo hamiltoniano
G . h a m i l t o n i a n _ c y c l e ( a l g o r i t h m=’ b a c k t r a c k ’)
nos devolverá que efectivamente lo ha encontrado y cual es el ciclo que ha encontrado:
(True, [’ 110 ’, ’ 111 ’, ’ 101 ’, ’ 001 ’, ’ 011 ’, ’ 010 ’, ’ 000 ’, ’ 100 ’])
La representación gráfica que nos hace sage con G.plot(layout =’spring’)es
000 001 010 011 100 101 110 111
Definición
Sea G = (V,E) un grafo y sea C un conjunto de colores. Una coloración es una aplicación c : V → C tal que para toda arista (u,v) ∈ E se tiene que c(u) 6= c(v ).
Definición
Sea G = (V,E) un grafo y sea C un conjunto de colores. Una coloración es una aplicación c : V → C tal que para toda arista (u,v) ∈ E se tiene que c(u) 6= c(v ).
El número mínimo de colores necesario para que exista una coloración de un grafo se denomina su número cromático.
Definición
Sea G = (V,E) un grafo y sea C un conjunto de colores. Una coloración es una aplicación c : V → C tal que para toda arista (u,v) ∈ E se tiene que c(u) 6= c(v ).
El número mínimo de colores necesario para que exista una coloración de un grafo se denomina su número cromático. Se puede calcular con el comando G.chromatic_number()
Para calcular el número cromático del Grafo de Petersen haríamos lo siguiente:
G = graphs . P e t e r s e n G r a p h () G . c h r o m a t i c _ n u m b e r ()
Nos dirá que es 3. Si queremos una coloración concreta de los vértices, tenemos que importar el siguiente paquete:
from sage . graphs . g r a p h _ c o l o r i n g import v e r t e x _ c o l o r i n g v e r t e x _ c o l o r i n g ( G )
También podemo calcular todas las coloraciones posibles de un cierto número de colores:
from sage . graphs . g r a p h _ c o l o r i n g import
a l l _ g r a p h _ c o l o r i n g s G = graphs . P e t e r s e n G r a p h ()
for C in a l l _ g r a p h _ c o l o r i n g s (G , 3 ): print C
Nos escribirá todas las coloraciones posibles del grafo de Petersen con tres colores. Son muchas, las primeras que nos salen son:
{’#00ff00’:[1,3,5,9],’#ff0000’:[0,2,6],’#0000ff’:[4,7,8]} {’#00ff00’:[1,3,5],’#ff0000’:[0,2,8,9],’#0000ff’:[4,7,6]} {’#00ff00’:[1,3,5,9],’#ff0000’:[0,2,8],’#0000ff’:[4,7,6]} {’#00ff00’:[1,3,7],’#ff0000’:[0,2,8,9],’#0000ff’:[4,5,6]} {’#00ff00’:[1,4,5],’#ff0000’:[0,2,8,9],’#0000ff’:[3,7,6]} ...
Grafos Bipartidos
Quitando el caso de grafos sin aristas, el mínimo número de colores necesario para colorear un grafo es 2.
Grafos Bipartidos
Quitando el caso de grafos sin aristas, el mínimo número de colores necesario para colorear un grafo es 2.
Los grafos que se pueden colorear con dos colores se llaman grafos bipartidos.
Grafos Bipartidos
Quitando el caso de grafos sin aristas, el mínimo número de colores necesario para colorear un grafo es 2.
Los grafos que se pueden colorear con dos colores se llaman grafos bipartidos.
Grafos Bipartidos
Quitando el caso de grafos sin aristas, el mínimo número de colores necesario para colorear un grafo es 2.
Los grafos que se pueden colorear con dos colores se llaman grafos bipartidos.
Podemos definirlos en sage con BipartiteGraph.
Si B es un grafo bipartido, los dos conjuntos que forman el grafo se denotan en sage como B.left y B.right.
Grafos Bipartidos
Quitando el caso de grafos sin aristas, el mínimo número de colores necesario para colorear un grafo es 2.
Los grafos que se pueden colorear con dos colores se llaman grafos bipartidos.
Podemos definirlos en sage con BipartiteGraph.
Si B es un grafo bipartido, los dos conjuntos que forman el grafo se denotan en sage como B.left y B.right. Para saber si un grafo ordinario es bipartido podemos usar G.is_bipartite()
Introduzcamos el siguiente ejemplo:
B = B i p a r t i t e G r a p h ({0: [4 ,5 , 6], 1: [5], 2: [4 , 6], 3: [5 , 6] })
B . left B . right
Nos dirá respectivamente los conjuntos que determinan la partición
set ([0 , 1 , 2 , 3]) set ([4 , 5 , 6])
(Un conjunto es similar a una lista, pero en la que no podemos repetir elementos)
La representación gráfica de B se hace en lugar de en vertical, en horizontal: 0 1 2 3 4 5 6
También podemos definir un grafo y luego decirle cual es la partición a partir de la cual es un grafo bipartido.
También podemos definir un grafo y luego decirle cual es la partición a partir de la cual es un grafo bipartido.
Si el grafo incluye alguna unión entre vértices del mismo lado de la partición nos dará un error.
G = Graph ({0: [3 , 4],1: [4],2: [4 , 5] }) B = B i p a r t i t e G r a p h (G ,[ [0 ,1 , 2],[3 ,4 , 5] ]) B .plot()
Nos daría el siguiente dibujo: 0 1 2 3 4 5
Teorema de Kuratowski
Teorema de Kuratowski
Un grafo es plano si existe una representación plana del mismo. El teorema de Kuratowski nos caracteriza estos grafos como aquellos que no contienen una extensión esencial de K5 o K3,3
Teorema de Kuratowski
Un grafo es plano si existe una representación plana del mismo. El teorema de Kuratowski nos caracteriza estos grafos como aquellos que no contienen una extensión esencial de K5 o K3,3
Podemos saber si un grafo es plano en sage ponendo G.is_planar()
Podemos saber cual es la extensión esencial de K5 o K3,3 que ha
encontrado pasándole el parámetro kuratowski=True
G = graphs . P e t e r s e n G r a p h () G . i s _ p l a n a r ()
Nos dirá que el grafo de Petersen no es plano. El siguiente comando nos devolverá el subgrafo que buscamos:
Representación Plana de un Grafo
Dado un grafo plano, la representación plana de un grafo se puede obtener con layout=’planar’
G = graphs . C u b e G r a p h ( 3 ) G .plot( layout=’ planar ’)
Nos daría el siguiente dibujo: 000 001 010 011 100 101 110 111