Herowaree

kruskal

Jun 4th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int adapted_partition(long int* weights, long int* u, long int* v, long int begin, long int end){
  4. long int pivot, top, i, aux_u, aux_v;
  5. pivot = weights[begin];
  6. aux_u = u[begin];
  7. aux_v = v[begin];
  8.  
  9. top = begin;
  10. for(i = begin + 1; i <= end; i++){
  11. if(weights[i] < pivot){
  12. weights[top] = weights[i];
  13. weights[i] = weights[top + 1];
  14.  
  15. u[top] = u[i];
  16. u[i] = u[top + 1];
  17.  
  18. v[top] = v[i];
  19. v[i] = v[top + 1];
  20.  
  21. top++;
  22. }
  23. }
  24.  
  25. weights[top] = pivot;
  26. u[top] = aux_u;
  27. v[top] = aux_v;
  28.  
  29. return top;
  30. }
  31.  
  32. void adapted_quicksort(long int* weights, long int* u, long int* v, long int begin, long int end){ //Best case: O(n*logn) - Worst case: O(n²)
  33. long int middle;
  34. if(begin < end){
  35. middle = adapted_partition(weights, u, v, begin, end);
  36. adapted_quicksort(weights, u, v, begin, middle - 1);
  37. adapted_quicksort(weights, u, v, middle + 1, end);
  38. }
  39. }
  40.  
  41.  
  42. void kruskal(long int n, long int graph[n][n]){
  43. long int trees[n][n];
  44. long int trees_size[n];
  45. long int trees_index[n];
  46. long int trees_u[n][n];
  47. long int trees_v[n][n];
  48. long int trees_w[n][n];
  49.  
  50. long int num_valid_vertexs = 0;
  51. for(long int i = 0; i < n; i++){
  52. trees[i][0] = i;
  53. trees_index[i] = i;
  54. trees_size[i] = 1;
  55.  
  56. for(long int j = i+1; j < n; j++){
  57. if(graph[i][j] != 0){
  58. num_valid_vertexs+= 1;
  59. }
  60. }
  61. }
  62.  
  63. long int u[num_valid_vertexs], v[num_valid_vertexs], w[num_valid_vertexs];
  64. long int count = 0;
  65. for(long int i = 0; i < n; i++){
  66. for(long int j = i+1; j < n; j++){
  67. if(graph[i][j] != 0){
  68. u[count] = i;
  69. v[count] = j;
  70. w[count] = graph[i][j];
  71. count += 1;
  72. }
  73. }
  74. }
  75.  
  76. adapted_quicksort(w, u, v, 0, count - 1);
  77.  
  78. //printf("sorted weights: \n");
  79. //for(long int i = 0; i < count; i++){
  80. // printf("u: %ld - v: %ld - weight: %ld\n", u[i], v[i], w[i]);
  81. //}
  82.  
  83. for(long int i = 0; i < count; i++){
  84. //printf("trees indexes: \n");
  85. //for(long int k = 0; k < n; k++){
  86. // printf("tree id: %ld - parent: %ld\n", k, trees_index[k]);
  87. //}
  88.  
  89. if(trees_index[u[i]] != trees_index[v[i]]){
  90. //printf("u: %ld - v: %ld - weight: %ld\n", u[i], v[i], w[i]);
  91. //printf("mixing tree %ld with tree %ld\n", trees_index[u[i]], trees_index[ v[i] ]);
  92.  
  93. //printf("before: \n");
  94. //printf("tree %ld (size: %ld): \n", trees_index[u[i]], trees_size[trees_index[u[i]]]);
  95. //for(int k = 0; k < trees_size[trees_index[u[i]]]; k++){
  96. // printf("%ld ", trees[trees_index[u[i]]][k]);
  97. //}
  98. //printf("\n");
  99.  
  100. //printf("tree %ld: (size: %ld)\n", trees_index[v[i]], trees_size[trees_index[v[i]]]);
  101. //for(int k = 0; k < trees_size[trees_index[v[i]]]; k++){
  102. // printf("%ld ", trees[trees_index[v[i]]][k]);
  103. //}
  104. //printf("\n\n");
  105.  
  106. long int j = 0;
  107. long int old_size_first_tree = trees_size[ trees_index[ u[i] ] ];
  108. long int old_size_second_tree = trees_size[ trees_index[ v[i] ] ];
  109.  
  110. while(j < trees_size[ trees_index[ v[i] ] ]){
  111. //printf("add %ld to tree %ld\n", trees[trees_index[v[i]]][j], trees_index[ u[i] ]);
  112. trees[ trees_index[ u[i] ] ][ trees_size[trees_index[u[i]]] ] = trees[trees_index[v[i]]][j];
  113.  
  114. trees_size[ trees_index[ u[i] ] ] += 1;
  115. j++;
  116. }
  117.  
  118. // trees with only one vertex
  119. if(old_size_first_tree == 1 && old_size_second_tree == 1){
  120. trees_u[ trees_index[ u[i] ] ][0] = u[i];
  121. trees_v[ trees_index[ u[i] ] ][0] = v[i];
  122. trees_w[ trees_index[ u[i] ] ][0] = w[i];
  123.  
  124. }else{
  125. for(long int k = 0; k < (old_size_second_tree - 1); k++){
  126. trees_u[ trees_index[ u[i] ] ][old_size_first_tree - 1] = trees_u[ trees_index[ v[i] ] ][k];
  127.  
  128. trees_v[ trees_index[ u[i] ] ][old_size_first_tree - 1] = trees_v[ trees_index[ v[i] ] ][k];
  129.  
  130. trees_w[ trees_index[ u[i] ] ][old_size_first_tree - 1] = trees_w[ trees_index[ v[i] ] ][k];
  131.  
  132. old_size_first_tree += 1;
  133. }
  134.  
  135. trees_u[ trees_index[ u[i] ] ][old_size_first_tree - 1] = u[i];
  136. trees_v[ trees_index[ u[i] ] ][old_size_first_tree - 1] = v[i];
  137. trees_w[ trees_index[ u[i] ] ][old_size_first_tree - 1] = w[i];
  138. }
  139.  
  140. //printf("vertexes: \n");
  141. //for(long int k = 0; k < trees_size[ trees_index[ u[i] ] ] - 1; k++){
  142. // printf("u: %ld - v: %ld - w: %ld\n", trees_u[trees_index[ u[i] ]][k], trees_v[trees_index[ u[i] ]][k], trees_w[trees_index[ u[i] ]][k]);
  143. //}
  144. //printf("\n");
  145.  
  146. //printf("trees indexes: \n");
  147. long int old_index = trees_index[v[i]];
  148. for(long int k = 0; k < n; k++){
  149. if(trees_index[k] == old_index){
  150. trees_index[k] = trees_index[u[i]];
  151. }
  152. //printf("tree id: %ld - parent: %ld\n", k, trees_index[k]);
  153. }
  154.  
  155. //printf("after: \n");
  156. //printf("tree %ld (size: %ld): \n", trees_index[u[i]], trees_size[trees_index[u[i]]]);
  157. //for(int k = 0; k < trees_size[trees_index[u[i]]]; k++){
  158. // printf("%ld ", trees[trees_index[u[i]]][k]);
  159. //}
  160. //printf("\n");
  161.  
  162. }
  163. }
  164.  
  165. /* uncomment to see the minimal spanning tree
  166. printf("---- minimal spanning tree ----\n");
  167. for(long int i = 0; i < trees_size[ trees_index[0] ] - 1; i++){
  168. printf("u: %ld - w: %ld - w: %ld\n", trees_u[trees_index[0]][i], trees_v[trees_index[0]][i], trees_w[trees_index[0]][i]);
  169. total += trees_w[trees_index[0]][i];
  170. }
  171. printf("\n")
  172. */
  173.  
  174. long int total = 0;
  175. for(long int i = 0; i < trees_size[ trees_index[0] ] - 1; i++){
  176. total += trees_w[trees_index[0]][i];
  177. }
  178. printf("%ld\n", total);
  179. }
  180.  
  181. int main(void) {
  182. long int n;
  183.  
  184. scanf("%ld", &n);
  185.  
  186. long int graph[n][n];
  187. long int weight;
  188.  
  189. for(long int i = 0; i < n-1; i++){
  190. for(long int j = 0; j < n - 1 - i; j++){
  191. scanf("%ld", &weight);
  192. graph[i][j+i+1] = weight;
  193. graph[i+j+1][i] = weight;
  194. }
  195. graph[i][i] = 0;
  196. }
  197. graph[n-1][n-1] = 0;
  198.  
  199. kruskal(n, graph);
  200. }
Advertisement
Add Comment
Please, Sign In to add comment