Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. /**
  2. * Created by Mateusz Soliwodzki on 20.02.2017.
  3. */
  4. import java.util.Stack;
  5.  
  6.  
  7. public class Skojarzenie {
  8.  
  9. static int V;
  10. static int E;
  11. static Stack<Integer> q = new Stack<>();
  12. static int[][] G;
  13. static int[] colorArr;
  14. static int fmax;
  15. static int[][] C; // Macierz przepustowości
  16. static int[][] F; // Macierz przepływów netto
  17. static int[] P;
  18. static int[] CFP;
  19.  
  20. static boolean isBipartite()
  21. {
  22.  
  23. for (int i=0; i<V; ++i)
  24. colorArr[i] = 0;
  25.  
  26. for(int j = 0; j<V; j++){
  27. if(colorArr[j] == 0){
  28. colorArr[j] = 1;
  29. q.add(j);
  30. while (q.size() != 0)
  31. {
  32. int u = q.peek();
  33. q.pop();
  34. for (int v=0; v<V; ++v)
  35. {
  36. if (G[u][v]== 1 && colorArr[v]==0)
  37. {
  38. colorArr[v] = -colorArr[u];
  39. q.add(v);
  40. }
  41. else if (G[u][v]== 1 && colorArr[v] == colorArr[u])
  42. return false;
  43. }
  44. }
  45. }
  46. }
  47. return true;
  48. }
  49.  
  50. public static void main(String args[]) {
  51.  
  52. V = 10;
  53. E = 17;
  54. colorArr = new int[V];
  55. G = new int[][]{
  56. // 0 1 2 3 4 5 6 7 8 9
  57. {0, 0, 1, 1, 1, 0, 0, 0, 1, 0}, //0
  58. {0, 0, 1, 0, 1, 0, 0, 0, 1, 0}, //1
  59. {1, 1, 0, 0, 0, 1, 0, 1, 0, 0}, //2
  60. {1, 0, 0, 0, 0, 0, 0, 1, 0, 1}, //3
  61. {1, 1, 0, 0, 0, 1, 0, 0, 0, 0}, //4
  62. {0, 0, 1, 0, 1, 0, 1, 0, 0, 0}, //5
  63. {0, 0, 0, 0, 0, 1, 0, 1, 0, 1}, //6
  64. {0, 0, 0, 1, 0, 0, 1, 0, 0, 0}, //7
  65. {1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, //8
  66. {0, 0, 0, 1, 1, 0, 1, 0, 1, 0}, //9
  67. };
  68. if(isBipartite())
  69. {
  70. C = new int [V+2][V+2]; // Macierz przepustowości krawędzi
  71. F = new int [V+2][V+2]; // Macierz przepływów netto
  72.  
  73. for(int i = 0; i <= V + 1; i++)
  74. {
  75. C[i] = new int [V+2];
  76. F[i] = new int [V+2];
  77. for(int j = 0; j <= V + 1; j++)
  78. {
  79. C[i][j] = 0;
  80. F[i][j] = 0;
  81. }
  82. }
  83.  
  84. // Ustawiamy macierz przepustowości
  85. for(int i = 0; i < V; i++)
  86. if(colorArr[i] == -1)
  87. {
  88. for(pr = G[i]; pr; pr = pr -> next) // Przeglądamy listę sąsiadów wierzchołka niebieskiego
  89. C[i][pr->data] = 1; // Przepustowość krawędzi do wierzchołka czerwonego
  90. C[V][i] = 1; // Przepustowość krawędzi od źródła
  91. }
  92. else C[i][V+1] = 1; // Przepustowość krawędzi do ujścia
  93.  
  94. //**************************************************
  95. //** Tutaj rozpoczyna się algorytm Edmondsa-Karpa **
  96. //**************************************************
  97.  
  98. fmax = 0;
  99.  
  100. while(true)
  101. {
  102. for(int i = 0; i <= V + 1; i++) P[i] = -1;
  103.  
  104. P[V] = -2;
  105. CFP[V] = Integer.MAX_VALUE;
  106.  
  107. while(!q.empty()) q.pop();
  108. q.push(V);
  109.  
  110. esc = false;
  111.  
  112. while(!q.empty())
  113. {
  114. v = q.peek(); q.pop();
  115.  
  116. for(int u = 0; u <= V + 1; u++)
  117. {
  118. cp = C[v][u] - F[v][u];
  119. if(cp && (P[u] == -1))
  120. {
  121. P[u] = v;
  122. if(CFP[v] > cp) CFP[u] = cp; else CFP[u] = CFP[v];
  123. if(u == V+1)
  124. {
  125. fmax += CFP[V+1];
  126. i = u;
  127. while(i != V)
  128. {
  129. v = P[i];
  130. F[v][i] += CFP[V+1];
  131. F[i][v] -= CFP[V+1];
  132. i = v;
  133. }
  134. esc = true; break;
  135. }
  136. Q.push(u);
  137. }
  138. }
  139. if(esc) break;
  140. }
  141. if(!esc) break;
  142. }
  143.  
  144. System.out.println("Liczba skojarzeń : " + fmax);
  145. if(fmax > 0)
  146. for(int v = 0; v < V; v++)
  147. for(int u = 0; u < V; u++)
  148. if((C[v][u] == 1) && (F[v][u] == 1))
  149. System.out.println(v + " - "+ u);
  150. }else
  151. System.out.println("Graf nie jest dwudzielny");
  152. }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement