Original title links
with the most stupid way to do that is called a serious exercise of writing code, in fact, is not easy writing. . .
Note to open a large array of points, long long defined MAXX should be large enough to sixth group of big data
Code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100005;
ll c[5][maxn],book[maxn],head[maxn],d[maxn][5],bb[2*maxn],maxx=99999999999999999,cnt=1,n;
struct node
{
int to,next;
}q[2*maxn];
void add(int a,int b)
{
q[cnt].to=b;
q[cnt].next=head[a];
head[a]=cnt++;
}
ll ask(int u,int f)
{
int flag=0;
for(int i=head[u];i!=-1;i=q[i].next)
{
if(q[i].to==f){continue;}
flag++;
}
return flag;
}
ll query(int u,int f)
{
for(int i=head[u];i!=-1;i=q[i].next)
{
if(q[i].to==f){continue;}
return q[i].to;
}
}
void init()
{
for(int i=1;i<=n;i++)
{
d[i][1]=d[i][2]=d[i][3]=0;
}
}
void dfs(int u,int f,int e,int se)
{
for(int i=head[u];i!=-1;i=q[i].next)
{
int v=q[i].to;
if(v==f){continue;}
dfs(v,u,e,se);
if(ask(v,u)==0)
{
d[v][e]=c[e][v];
d[u][se]=d[v][e]+c[se][u];
}
else
{
int vv=query(v,u);
if(d[vv][1]!=0&&d[v][2]!=0){d[u][3]=d[v][2]+c[3][u];}
if(d[vv][2]!=0&&d[v][1]!=0){d[u][3]=d[v][1]+c[3][u];}
if(d[vv][1]!=0&&d[v][3]!=0){d[u][2]=d[v][3]+c[2][u];}
if(d[vv][3]!=0&&d[v][1]!=0){d[u][2]=d[v][1]+c[2][u];}
if(d[vv][2]!=0&&d[v][3]!=0){d[u][1]=d[v][3]+c[1][u];}
if(d[vv][3]!=0&&d[v][2]!=0){d[u][1]=d[v][2]+c[1][u];}
}
}
return ;
}
ll tt(int u)
{
if(d[u][1]!=0)
{
if(d[u][1]<maxx)
{maxx=d[u][1];return 1;}
else{return 0;}
}
if(d[u][2]!=0)
{
if(d[u][2]<maxx)
{maxx=d[u][2];return 1;}
else{return 0;}
}
if(d[u][3]!=0)
{
if(d[u][3]<maxx)
{maxx=d[u][3];return 1;}
else{return 0;}
}
}
void dfs2(int u,int f,int e,int se)
{
for(int i=head[u];i!=-1;i=q[i].next)
{
int v=q[i].to;
if(v==f){continue;}
dfs2(v,u,e,se);
if(ask(v,u)==0)
{bb[v]=e;bb[u]=se;}
else
{
int vv=query(v,u);
if(bb[vv]==1&&bb[v]==2){bb[u]=3;}
if(bb[vv]==1&&bb[v]==3){bb[u]=2;}
if(bb[vv]==2&&bb[v]==3){bb[u]=1;}
if(bb[vv]==2&&bb[v]==1){bb[u]=3;}
if(bb[vv]==3&&bb[v]==1){bb[u]=2;}
if(bb[vv]==3&&bb[v]==2){bb[u]=1;}
}
}
}
int main()
{
memset(head,-1,sizeof(head));
ll a,b,flag=1,u;
ll tx,ty;
cin>>n;
for(int i=1;i<=n;i++)
cin>>c[1][i];
for(int i=1;i<=n;i++)
cin>>c[2][i];
for(int i=1;i<=n;i++)
cin>>c[3][i];
for(int i=1;i<=n-1;i++)
{
cin>>a>>b;
book[a]++;book[b]++;
add(a,b);add(b,a);
}
for(int i=1;i<=n;i++)
{
if(book[i]>2)
{flag=0;break;}
if(book[i]==1)
{u=i;}
}
if(!flag){cout<<"-1"<<endl;return 0;}
init();
dfs(u,u,1,2);
if(tt(u)==1){tx=1;ty=2;}
init();
dfs(u,u,2,1);
if(tt(u)==1){tx=2;ty=1;}
init();
dfs(u,u,1,3);
if(tt(u)==1){tx=1;ty=3;}
init();
dfs(u,u,3,1);
if(tt(u)==1){tx=3;ty=1;}
init();
dfs(u,u,2,3);
if(tt(u)==1){tx=2;ty=3;}
init();
dfs(u,u,3,2);
if(tt(u)==1){tx=3;ty=2;}
dfs2(u,u,tx,ty);
cout<<maxx<<endl;
for(int i=1;i<=n;i++)
{
cout<<bb[i]<<" ";
}
cout<<endl;
return 0;
}