codeforces (D. Paint the Tree) tree DP?

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;
}
Published 36 original articles · won praise 4 · Views 1378

Guess you like

Origin blog.csdn.net/qq_43781431/article/details/105024602