Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <climits>
  6.  
  7. void make_set(std::vector<int>& p, std::vector<int>& rank, int n) {
  8. p.clear();
  9.  
  10. for (int i = 0; i < n; ++i) {
  11. p.push_back(i);
  12. rank.push_back(1);
  13. }
  14. }
  15.  
  16. int find_set(int a, std::vector<int>& p) {
  17. if (a == p[a])
  18. return a;
  19.  
  20. p[a] = find_set(p[a], p);
  21.  
  22. return p[a];
  23. }
  24.  
  25. void union_set(int a, int b, std::vector<int>& p,
  26. std::vector<int>& rank) {
  27. a = find_set(a, p);
  28. b = find_set(b, p);
  29.  
  30. if (rank[a] > rank[b]) {
  31. p[b] = a;
  32. } else {
  33. if (rank[a] == rank[b]) {
  34. rank[a] += 1;
  35.  
  36. p[b] = a;
  37. } else {
  38. p[a] = b;
  39. }
  40. }
  41. }
  42.  
  43. struct edge {
  44. int w;
  45.  
  46. int a;
  47. int b;
  48. int idx;
  49. };
  50.  
  51. bool edgeComp(const edge& a, const edge& b) {
  52. return a.w < b.w;
  53. }
  54.  
  55. int main() {
  56. std::ifstream inp("input.txt");
  57.  
  58. int n, m;
  59.  
  60. inp >> n >> m;
  61.  
  62. std::vector<edge> e;
  63.  
  64. int a, b, c;
  65. edge tmp;
  66. for (int j = 0; j < m; ++j) {
  67. inp >> a >> b >> c;
  68.  
  69. --a;
  70. --b;
  71.  
  72. tmp.w = c;
  73. tmp.a = a;
  74. tmp.b = b;
  75. tmp.idx = j + 1;
  76.  
  77. e.push_back(tmp);
  78. }
  79.  
  80. std::vector<int> p;
  81. std::vector<int> rank;
  82.  
  83. make_set(p, rank, n);
  84.  
  85. int e1, e2;
  86. int w;
  87.  
  88. std::sort(e.begin(), e.end(), edgeComp);
  89. int sum = 0;
  90. std::vector<int> cabLen;
  91. std::vector<int> cab2idx;
  92. for (int i = 0; i < m; ++i) {
  93. e1 = e[i].a;
  94. e2 = e[i].b;
  95. w = e[i].w;
  96.  
  97. a = find_set(e1, p);
  98. b = find_set(e2, p);
  99.  
  100. if (a == b)
  101. continue;
  102.  
  103. sum += w;
  104. cabLen.push_back(w);
  105. cab2idx.push_back(e[i].idx);
  106.  
  107. union_set(a, b, p, rank);
  108. }
  109.  
  110. int cost[2];
  111. int len[2];
  112. int cost2idx[2];
  113. cost2idx[0] = 5;
  114. cost2idx[1] = 6;
  115.  
  116. inp >> cost[0] >> len[0] >> cost[1] >> len[1];
  117.  
  118. if (len[0] + len[1] < sum) {
  119. std::cout << "Impossible";
  120. return 0;
  121. }
  122.  
  123. int swapped = 0;
  124. if (cost[0] > cost[1]) {
  125. int tmp = cost[0];
  126. cost[0] = cost[1];
  127. cost[1] = tmp;
  128.  
  129. tmp = len[0];
  130. len[0] = len[1];
  131. len[1] = tmp;
  132.  
  133. tmp = cost2idx[0];
  134. cost2idx[0] = cost2idx[1];
  135. cost2idx[1] = tmp;
  136.  
  137. swapped = 1;
  138. }
  139.  
  140. std::vector<std::vector<int>> task(cabLen.size() + 1, std::vector<int>(len[0] + 1, 0));
  141.  
  142. for (int i = 1; i <= cabLen.size(); ++i) {
  143. for (int j = 1; j <= len[0]; ++j) {
  144. task[i][j] = task[i - 1][j];
  145.  
  146. if (j < cabLen[i - 1])
  147. continue;
  148.  
  149. for (int k = 0; k < i; ++k)
  150. if (task[i][j] < (task[k][j - cabLen[i - 1]] + cabLen[i - 1] * cost[0]))
  151. task[i][j] = task[k][j - cabLen[i - 1]] + cabLen[i - 1] * cost[0];
  152. }
  153. }
  154.  
  155. int cheapCost = task[cabLen.size()][len[0]];
  156. std::vector<int> cab2cat(cabLen.size(), cost2idx[1]);
  157.  
  158. int i = cabLen.size();
  159. int j = len[0];
  160.  
  161. while (i > 0 && j > 0) {
  162. if (task[i][j] == task[i - 1][j]) {
  163. --i;
  164. continue;
  165. }
  166.  
  167. int k = i - 1;
  168.  
  169. while (task[i][j] != (task[k][j - cabLen[i - 1]] + cabLen[i - 1] * cost[0]))
  170. --k;
  171.  
  172. cab2cat[i - 1] = cost2idx[0];
  173. j = j - cabLen[i - 1];
  174. i = k;
  175. }
  176.  
  177. int totalCost = 0;
  178. int totalLen = 0;
  179.  
  180. for (i = 0; i < cabLen.size(); ++i)
  181. if (cab2cat[i] == 5) {
  182. if (swapped) {
  183. totalCost += cabLen[i] * cost[1];
  184. totalLen += cabLen[i];
  185. }
  186. else {
  187. totalCost += cabLen[i] * cost[0];
  188. }
  189. } else {
  190. if (swapped) {
  191. totalCost += cabLen[i] * cost[0];
  192. }
  193. else {
  194. totalCost += cabLen[i] * cost[1];
  195. totalLen += cabLen[i];
  196. }
  197. }
  198.  
  199. if (totalLen > len[1]) {
  200. std::cout << "Impossible";
  201. return 0;
  202. }
  203.  
  204. std::cout << totalCost << std::endl;
  205.  
  206. for (i = 0; i < cabLen.size(); ++i) {
  207. std::cout << cab2idx[i] << " " << cab2cat[i] << std::endl;
  208. }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement