特别简单,只有链的形式才符合要求,那么枚举前两个点的颜色搞一下就可以
#include <bits/stdc++.h> using namespace std; int a[5][100010],pos[1000010],ok=0,f[1000010]; int o[10]; vector<int> h[100010]; set<int> s[5]; set<int>::iterator it; long long d[5][5]; void dfs(int u,int fa) { f[u]=fa; if(ok==-1) return ; if(h[u].size()>2) { ok=-1; return ; } int k=0; for(int i=0; i<h[u].size(); i++) { int v=h[u][i]; if(v==fa) continue; k++; while(pos[f[u]]==k||k==pos[u]) k++; pos[v]=k; s[k].insert(v); dfs(v,u); } } int main() { int n,i,j,x,y; scanf("%d",&n); for(i=1; i<=3; i++) for(j=1; j<=n; j++) scanf("%d",&a[i][j]); for(i=1; i<n; i++) { scanf("%d%d",&x,&y); h[x].push_back(y); h[y].push_back(x); } s[1].insert(1); pos[1]=1; dfs(1,0); if(ok==-1) return puts("-1"),0; for(i=1; i<=3; i++) for(it=s[i].begin(); it!=s[i].end(); it++) { d[i][1]+=a[1][*it]; d[i][2]+=a[2][*it]; d[i][3]+=a[3][*it]; } long long mmin; mmin=d[1][1]+d[2][2]+d[3][3]; mmin=min(mmin,d[1][1]+d[2][3]+d[3][2]); mmin=min(mmin,d[1][2]+d[2][1]+d[3][3]); mmin=min(mmin,d[1][2]+d[2][3]+d[3][1]); mmin=min(mmin,d[1][3]+d[2][2]+d[3][1]); mmin=min(mmin,d[1][3]+d[2][1]+d[3][2]); printf("%lld ",mmin); if(mmin==d[1][1]+d[2][2]+d[3][3]) o[1]=1,o[2]=2,o[3]=3; else if(mmin==d[1][1]+d[2][3]+d[3][2]) o[1]=1,o[2]=3,o[3]=2; else if(mmin==d[1][2]+d[2][1]+d[3][3]) o[1]=2,o[2]=1,o[3]=3; else if(mmin==d[1][2]+d[2][3]+d[3][1]) o[1]=2,o[2]=3,o[3]=1; else if(mmin==d[1][3]+d[2][2]+d[3][1]) o[1]=3,o[2]=2,o[3]=1; else if(mmin==d[1][3]+d[2][1]+d[3][2]) o[1]=3,o[2]=1,o[3]=2; for(i=1;i<=n;i++) printf("%d ",o[pos[i]]); return 0; }