Guest User

Untitled

a guest
Jul 19th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. public class ColorearGrafo {
  5.  
  6. /**
  7. * Colorea todos los vertices del grafo usando la técnica de Voraces.
  8. *
  9. * @param matrizAdj int[][] - La matriz de adyacencia define las conexiones de
  10. * vertices en el grafo.
  11. *
  12. * @param vertices List - Lista con los vertices del grafo.
  13. *
  14. * @return int - Retorna el número de colores usados.
  15. */
  16. public static int colorGrafo(int[][] matrizAdj, List vertices) {
  17.  
  18. int colorActual = 0;
  19. boolean esCompleto = false;
  20.  
  21. /* do...mientras se colorean todos los nodos */
  22. do {
  23.  
  24. /* Se incrementa para obtener el siguiente color que no ha sido usado */
  25. colorActual++;
  26.  
  27. /* Pintamos todos los nodos posibles del mismo color */
  28. coloreadoConUnColorVoraz(matrizAdj, vertices, colorActual);
  29.  
  30. /* Mira si hay algún nodo a la izquierda no coloreado */
  31. esCompleto = true; // Se asume que no hay nodos sin colorear
  32.  
  33. //Comprueba que no haya ningun vértice con color = 0, si lo hay
  34. //sigue con otro color
  35. for (int i = 0; esCompleto && i < vertices.size(); i++) {
  36. //Cuando es el color = 0 sale del for y continua con otro color
  37. //ya que hay aún algún vértice sin colorear
  38. esCompleto = (((Vertice) vertices.get(i)).getNumeroColor() != 0);
  39. }
  40.  
  41. }
  42. while (!esCompleto);
  43.  
  44. /* Retornamos el número de colores usados */
  45. return colorActual;
  46. }
  47.  
  48. /**
  49. * Coloreamos de un mismo color tantos vértices del grafo como sean posibles,
  50. * usando la técnica de voraces.
  51. *
  52. * @param matrizAdj int[][] - La matriz de adyacencia define las conexiones de
  53. * vertices en el grafo.
  54. *
  55. * @param vertices List - Lista con los vertices del grafo.
  56. *
  57. * @param numeroColor int - El color con el cual coloreamos los vertices al
  58. * llamar a este método.(Varia según se vayan usando los colores).
  59. *
  60. * @return List - Retorna la lista de los nuevos vértices coloreados.
  61. */
  62. private static List coloreadoConUnColorVoraz(int[][] matrizAdj,
  63. List vertices,
  64. int numeroColor) {
  65.  
  66. List verticesColoreados = new ArrayList();
  67.  
  68. /* Encontramos el primer vértice sin colorear */
  69. Vertice v = null;
  70. for (int i = 0; v == null && i < vertices.size(); i++) {
  71. if ( ( (Vertice) vertices.get(i)).getNumeroColor() == 0) {
  72. v = (Vertice) vertices.get(i);
  73. }
  74. }
  75. /*Pintamos todos los vértices que no sean adyacentes*/
  76. while (v != null) {
  77. /* Miramos si el vértice v es adyacente con otros vértices en el color actual*/
  78. boolean adyacente = false;
  79.  
  80. for (int i = 0; !adyacente && i < verticesColoreados.size(); i++) {
  81. //Comprueba si alguno de los ya coloreados con adyacentes para no pintarlo
  82. adyacente = !sonAdyacentes(matrizAdj, (Vertice) verticesColoreados.get(i), v);
  83. }
  84. /* Si no es adyacente con otros vértices, coloreamos el vértice v
  85. y lo añadimos a la lista de coloreados*/
  86. if (!adyacente) {
  87. v.setNumeroColor(numeroColor);
  88. verticesColoreados.add(v);
  89. }
  90.  
  91. /* Encontrar el siguiente vértice sin colorear */
  92. int inicioIndice = vertices.indexOf(v);
  93. v = null;
  94. for (int i = inicioIndice + 1; v == null && i < vertices.size(); i++) {
  95. if ( ( (Vertice) vertices.get(i)).getNumeroColor() == 0) {
  96. v = (Vertice) vertices.get(i);
  97. }
  98. }
  99. }
  100. return verticesColoreados;
  101. }
  102.  
  103.  
  104. /**
  105. * Comprueba si entre dos vertices pasados como parámetro hay conexión.
  106. *
  107. * @param matrizAdj int[][] - La matriz de adyacencia define las conexiones de
  108. * vertices en el grafo.
  109. *
  110. * @param v1 Vertice - El primer vértice.
  111. *
  112. * @param v2 Vertice - El segundo vértice.
  113. *
  114. * @return boolean - Retorna true si v1 y v2 están relacionados (o en la matrizAdj)
  115. * o false en caso contrario.
  116. */
  117. private static boolean sonAdyacentes(int[][] matrizAdj, Vertice v1,
  118. Vertice v2) {
  119.  
  120. int id1 = v1.getIdentidad();
  121. int id2 = v2.getIdentidad();
  122.  
  123. return matrizAdj[id1][id2] == 0;
  124. }
  125.  
  126. }
  127.  
  128. int main(){
  129.  
  130.  
  131. return 0;
  132.  
  133. }
Add Comment
Please, Sign In to add comment