YorKnEz

pb10

Oct 9th, 2022
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct Barrier {
  5. int to;
  6. int cost;
  7. } * b;
  8.  
  9. struct Solution {
  10. int node;
  11. int newBarrierNode;
  12. };
  13.  
  14. Solution *sol, *tmpsol;
  15. int **a, n, mincost = 999999;
  16. bool *v;
  17.  
  18. void init(int n);
  19.  
  20. void dfs(int k, int len, int cost, int end);
  21.  
  22. int main() {
  23. freopen("in.txt", "r", stdin);
  24.  
  25. int m, node1, node2, cost, start, end, to;
  26.  
  27. scanf("%d %d %d %d", &n, &m, &start, &end);
  28.  
  29. init(n);
  30.  
  31. for (int i = 0; i < m; i++) {
  32. scanf("%d %d %d", &node1, &node2, &cost);
  33.  
  34. a[node1][node2] = a[node2][node1] = cost;
  35. }
  36.  
  37. for (int i = 1; i <= n; i++) {
  38. scanf("%d %d", &to, &cost);
  39.  
  40. b[i] = {to, cost};
  41. }
  42.  
  43. v[start] = 1;
  44. tmpsol[0].node = start;
  45.  
  46. dfs(start, 1, 0, end);
  47.  
  48. if (!sol[0].node) {
  49. printf("0\n"); // no solution found
  50. } else {
  51. int i = 0;
  52.  
  53. while (sol[i].node) {
  54. printf("%d ", sol[i++].node);
  55. }
  56. printf("\n");
  57. for (int j = 0; j < i; j++) {
  58. printf("%d ", sol[j].newBarrierNode);
  59. }
  60. printf("\n");
  61. }
  62.  
  63. return 0;
  64. }
  65.  
  66. void init(int n) {
  67. a = (int **)malloc(sizeof(int *) * (n + 1));
  68.  
  69. for (int i = 0; i <= n; i++) {
  70. a[i] = (int *)malloc(sizeof(int) * (n + 1));
  71. }
  72.  
  73. b = (Barrier *)malloc(sizeof(Barrier) * (n + 1));
  74.  
  75. sol = (Solution *)malloc(sizeof(Solution) * n);
  76. tmpsol = (Solution *)malloc(sizeof(Solution) * n);
  77.  
  78. v = (bool *)malloc(sizeof(bool) * (n + 1));
  79. }
  80.  
  81. void dfs(int k, int len, int cost, int end) {
  82. if (k == end) {
  83. if (cost < mincost) {
  84. // printf("-- Found new minimal solution (old: %d, new: %d) --\n ",
  85. // mincost, cost);
  86. mincost = cost;
  87. for (int i = 0; i < n; i++) {
  88. // printf("%d ", tmpsol[i].node);
  89. sol[i] = tmpsol[i];
  90. }
  91. // printf("\n\n");
  92. }
  93. } else {
  94. for (int i = 1; i <= n; i++) {
  95. if (a[k][i] && !v[i]) {
  96. // printf("Found node %d that connects to %d\n", i, k);
  97. // barrier can be from k to i
  98. if (b[k].to == i) {
  99. // printf("Found barrier from node %d to %d\n", k, i);
  100. // search for another highway to move the barrier to
  101. for (int j = 1; j <= n; j++) {
  102. if (a[k][j] && i != j && !v[j]) {
  103. // printf("Moving barrier of %d from %d to %d\n", k, i, j);
  104. b[k].to = j;
  105. v[i] = 1;
  106. tmpsol[len].node = i;
  107. tmpsol[len - 1].newBarrierNode = j;
  108.  
  109. // printf("Entering dfs\n\n");
  110. dfs(i, len + 1, cost + b[k].cost + a[k][i], end);
  111.  
  112. // printf("Moving barrier of %d back from %d to %d\n", k, j, i);
  113. b[k].to = i;
  114. tmpsol[len].node = 0;
  115. tmpsol[len - 1].newBarrierNode = 0;
  116. v[i] = 0;
  117. }
  118. }
  119. }
  120. // or it can be from i to k
  121. else if (b[i].to == k) {
  122. // printf("Found barrier from node %d to %d\n", i, k);
  123. // search for another highway to move the barrier to
  124. for (int j = 1; j <= n; j++) {
  125. if (a[i][j] && k != j && !v[j]) {
  126. // printf("Moving barrier of %d from %d to %d\n", i, k, j);
  127. b[i].to = j;
  128. v[i] = 1;
  129. tmpsol[len].node = i;
  130. tmpsol[len - 1].newBarrierNode = j;
  131.  
  132. // printf("Entering dfs\n\n");
  133. dfs(i, len + 1, cost + b[i].cost + a[k][i], end);
  134.  
  135. // printf("Moving barrier of %d back from %d to %d\n", i, j, k);
  136. b[i].to = k;
  137. tmpsol[len].node = 0;
  138. tmpsol[len - 1].newBarrierNode = 0;
  139. v[i] = 0;
  140. }
  141. }
  142. }
  143. // or there is no barrier
  144. else {
  145. v[i] = 1;
  146. tmpsol[len].node = i;
  147. tmpsol[len - 1].newBarrierNode = 0;
  148.  
  149. // printf("Entering dfs\n\n");
  150. dfs(i, len + 1, cost + a[k][i], end);
  151.  
  152. tmpsol[len].node = 0;
  153. tmpsol[len - 1].newBarrierNode = 0;
  154. v[i] = 0;
  155. }
  156. }
  157. }
  158. }
  159. }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment