zoukankan      html  css  js  c++  java
  • 树的性质——cf1244D

    特别简单,只有链的形式才符合要求,那么枚举前两个点的颜色搞一下就可以

    #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;
    }
  • 相关阅读:
    欧拉函数线性筛法
    欧拉筛素数
    05:登月计划
    09:LGTB 学分块
    2017.7.15清北夏令营精英班Day1解题报告
    T7316 yyy的最大公约数(者)
    T7314 yyy的巧克力(钟)
    T7315 yyy矩阵折叠(长)
    DataReader,DataTable利用泛型填充实体类
    数据库入库的方式实现
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11713822.html
Copyright © 2011-2022 走看看