Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2.  
  3. using namespace std;
  4.  
  5. int mod = 1000007;
  6. int main() {
  7. int n;
  8. cin >> n;
  9. vector<vector<int>> vec(n);
  10. int cArr[3][n];
  11. for(int i = 0; i < 3; i++)
  12. {
  13. for(int j = 0; j < n; j++)
  14. {
  15. cin >> cArr[i][j];
  16. }
  17. }
  18. int u,v;
  19.  
  20. for(int i = 0; i < n-1; i++)
  21. {
  22. cin >> u >> v;
  23. u--; v--;
  24. vec[u].push_back(v);
  25. vec[v].push_back(u);
  26. }
  27.  
  28. for(int i = 0; i < n; i++)
  29. {
  30. if(vec[i].size() > 2)
  31. {
  32. cout << -1; return 0;
  33. }
  34. }
  35.  
  36. int stInd = 0;
  37. for(int i = 0; i < n; i++)
  38. {
  39. if(vec[i].size() == 1) { stInd = i;
  40. break;}
  41. }
  42.  
  43. queue<pair<int,int>> q;
  44. int ans[6][n];
  45. long long costs[6];
  46. int cur_ans_index = 0;
  47.  
  48. for(int i = 0; i < 3; i++) {
  49. for(int j = 0; j < 3; j++) {
  50. if(i==j) continue;
  51. for(int z = 0; z < 3; z++) {
  52. if(z==j || z==i) continue;
  53. int perm[3] { i,j,z};
  54. while (q.size() > 0) q.pop();
  55. int cur_c[n];
  56. for (int index = 0; index < n; index++) cur_c[index] = -1;
  57. q.push({stInd, 0});
  58. long long cost = 0;
  59.  
  60. while (q.size() > 0) {
  61. auto cur = q.front();
  62. int h = cur.first;
  63. int c_val = cur.second;
  64. int n_val = c_val + 1;
  65. if(n_val == 3) n_val = 0;
  66. q.pop();
  67. cost+= cArr[perm[c_val]][h];
  68. cur_c[h] = perm[c_val];
  69. for(int k = 0; k < vec[h].size(); k++)
  70. {
  71. if(cur_c[vec[h][k]] == -1)
  72. {
  73. q.push({vec[h][k],n_val});
  74. }
  75. }
  76. }
  77. costs[cur_ans_index] = cost;
  78. for (int index = 0; index < n; index++) ans[cur_ans_index][index] = cur_c[index];
  79. cur_ans_index++;
  80.  
  81. }
  82. }
  83. }
  84.  
  85. long long deadMin = 9223372036854775800;
  86. for(int i = 0; i < 6; i++)
  87. {
  88. deadMin = min(deadMin,costs[i]);
  89. }
  90. int answind = 0;
  91. for(int i = 0; i < 6; i++)
  92. {
  93. if(costs[i] == deadMin)
  94. {
  95. answind = i;
  96. break;
  97. }
  98. }
  99. cout << deadMin << endl;
  100. for(int i = 0; i < n; i++)
  101. {
  102. cout << (ans[answind][i]+1) << " ";
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement