Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- int mod = 1000007;
- int main() {
- int n;
- cin >> n;
- vector<vector<int>> vec(n);
- int cArr[3][n];
- for(int i = 0; i < 3; i++)
- {
- for(int j = 0; j < n; j++)
- {
- cin >> cArr[i][j];
- }
- }
- int u,v;
- for(int i = 0; i < n-1; i++)
- {
- cin >> u >> v;
- u--; v--;
- vec[u].push_back(v);
- vec[v].push_back(u);
- }
- for(int i = 0; i < n; i++)
- {
- if(vec[i].size() > 2)
- {
- cout << -1; return 0;
- }
- }
- int stInd = 0;
- for(int i = 0; i < n; i++)
- {
- if(vec[i].size() == 1) { stInd = i;
- break;}
- }
- queue<pair<int,int>> q;
- int ans[6][n];
- long long costs[6];
- int cur_ans_index = 0;
- for(int i = 0; i < 3; i++) {
- for(int j = 0; j < 3; j++) {
- if(i==j) continue;
- for(int z = 0; z < 3; z++) {
- if(z==j || z==i) continue;
- int perm[3] { i,j,z};
- while (q.size() > 0) q.pop();
- int cur_c[n];
- for (int index = 0; index < n; index++) cur_c[index] = -1;
- q.push({stInd, 0});
- long long cost = 0;
- while (q.size() > 0) {
- auto cur = q.front();
- int h = cur.first;
- int c_val = cur.second;
- int n_val = c_val + 1;
- if(n_val == 3) n_val = 0;
- q.pop();
- cost+= cArr[perm[c_val]][h];
- cur_c[h] = perm[c_val];
- for(int k = 0; k < vec[h].size(); k++)
- {
- if(cur_c[vec[h][k]] == -1)
- {
- q.push({vec[h][k],n_val});
- }
- }
- }
- costs[cur_ans_index] = cost;
- for (int index = 0; index < n; index++) ans[cur_ans_index][index] = cur_c[index];
- cur_ans_index++;
- }
- }
- }
- long long deadMin = 9223372036854775800;
- for(int i = 0; i < 6; i++)
- {
- deadMin = min(deadMin,costs[i]);
- }
- int answind = 0;
- for(int i = 0; i < 6; i++)
- {
- if(costs[i] == deadMin)
- {
- answind = i;
- break;
- }
- }
- cout << deadMin << endl;
- for(int i = 0; i < n; i++)
- {
- cout << (ans[answind][i]+1) << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement