codeforces(D. Paint the Tree)树形DP?

原题链接
用最笨的方法做的,其名曰锻炼写代码的认真度,其实是不会简便写法。。。
注意数组开大点,long long 定义MAXX也要足够大,第六组给的数据挺大的

代码:

#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;
}
发布了36 篇原创文章 · 获赞 4 · 访问量 1378

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/105024602