Álgebra y Matemática Discreta Sesión de Prácticas 4 Álgebra y Matemática Discreta Sesión de Prácticas 4 (c) 2013 Leandro Marı́n, Francisco J. Vera, Gema M. Dı́az 7 Oct 2013 - 13 Oct 2013 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Familias de Grafos Grafos Completos Kn Podemos definir G = graphs.CompleteGraph(5) para obtener: 0 4 1 2 3 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Familias de Grafos Grafos Bipartidos Completos Kr ,s Podemos definir G = graphs.CompleteBipartiteGraph(3,3) para obtener: 0 1 2 3 4 5 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Familias de Grafos 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.IcosahedralGraph() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos 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() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos Escribamos el siguiente código: G = graphs . PetersenGraph () G . is_connected () G . degree () G . is_eulerian () Obtendremos True, [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], False. Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos El grafo de Petersen es el siguiente: 0 5 4 1 9 6 7 2 8 3 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos Vamos ahora a introducir uno que sı́ es euleriano: G = Graph () G . add_vertices ( range ( 6 ) ) G . add_edges ( [ (0 , 2 ) ,(0 , 1 ) ,(1 , 2 ) ,(1 , 3 ) ,(1 , 4 ) ,(2 , 3 ) ,(2 , 4 ) ,(3 , 4 ) ,(3 , 5 ) ,(4 , 5 ) ] ) G . is_connected () G . degree () G . is_eulerian () Obtendremos True, [2, 4, 4, 4, 4, 2], True. Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos Este grafo es el mismo que hemos visto en clase: 0 2 4 1 3 5 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos 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. sage nos 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 () Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos Nos proporciona la orientación del grafo que nos indica el sentido de recorrido: 3 2 0 5 4 1 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y 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. Se puede saber si un grafo es hamiltoniano en sage con el comando G.is_hamiltonian() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos Escribamos el siguiente código: G = graphs . CubeGraph ( 3 ) G . is_hamiltonian () Este es el cubo tridimensional, que nos dirá que sı́ es hamiltoniano y si le pedimos el ciclo hamiltoniano G . hamiltonian_cycle ( algorithm = ’ backtrack ’) nos devolverá que efectivamente lo ha encontrado y cual es el ciclo que ha encontrado: ( True , [ ’ 110 ’ , ’ 111 ’ , ’ 101 ’ , ’ 001 ’ , ’ 011 ’ , ’ 010 ’ , ’ 000 ’ , ’ 100 ’] ) Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Eulerianos y Hamiltonianos La representación gráfica que nos hace sage con G.plot(layout = ’spring’) es 001 011 000 010 111 101 110 100 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones 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() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones Para calcular el número cromático del Grafo de Petersen harı́amos lo siguiente: G = graphs . PetersenGraph () G . chromatic_number () Nos dirá que es 3. Si queremos una coloración concreta de los vértices, tenemos que importar el siguiente paquete: from sage . graphs . graph_coloring import vertex_coloring vertex_coloring ( G ) que nos devolverá la coloración [[0, 2, 8, 9], [3, 6, 7], [1, 4, 5]]. Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones También podemos calcular todas las coloraciones posibles de un cierto número de colores: from sage . graphs . graph_coloring import all_graph_colorings G = graphs . PetersenGraph () for C in all_graph_colorings (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: {0: {0: {0: {0: {0: ... [0, [0, [0, [0, [0, 2, 2, 2, 2, 2, 6], 1: 8, 9], 8], 1: 8, 9], 8, 9], [1, 3, 1: [1, [1, 3, 1: [1, 1: [1, 5, 3, 5, 3, 4, 9], 5], 9], 7], 5], 2: 2: 2: 2: 2: [4, [4, [4, [4, [3, 7, 7, 7, 5, 7, 8]} 6]} 6]} 6]} 6]} Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones 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() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones Introduzcamos el siguiente ejemplo: B = BipartiteGraph ( { 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) Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones La representación gráfica de B se hace en lugar de en vertical, en horizontal: 0 4 1 5 2 3 6 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones 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 = BipartiteGraph (G , [ [0 ,1 , 2 ] ,[3 ,4 , 5 ] ] ) B . plot () Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Coloraciones Nos darı́a el siguiente dibujo: 0 3 1 4 2 5 Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Planos 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 poniendo G.is_planar() Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Planos 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 . PetersenGraph () G . is_planar () Nos dirá que el grafo de Petersen no es plano. El siguiente comando nos devolverá el subgrafo que buscamos: G . is_planar ( kuratowski = True ) [ 1 ] Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Planos 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 . CubeGraph ( 3 ) G . plot ( layout = ’ planar ’) Álgebra y Matemática Discreta Sesión de Prácticas 4 Grafos Grafos Planos Nos darı́a el siguiente dibujo: 100 111 110 010 011 101 000 001