题意:给一个无向的无环的树,需要用三种颜色将他染色,相邻的三个点不能有重复的颜色。给出每个点染成每种颜色的花费,求最小的染色花费,如果给的图不能按要求染色,输出-1。

思路:只有三种颜色,相邻三个点还不能重复,说明一个点最多可以有两条边,那么这个图就是一条链。那首先就是用邻接表(也用过数组记录路径,但是不知道哪错了)把这条链用一个vector容器存起来,给这条链染色。因为只有三种颜色,所以只要确定了前两种,后面一条链的颜色就确定了。

注意:在第六组测试数据一直错,结果是因为main的初始值太小了,那就直接1e18 ,long long!!!

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
#include<vector>
using namespace std;
vector<int>p;
struct node
{
int cnt,c;
} qq[100010];
bool cmp(node a,node b)
{
return a.cnt<b.cnt;
}
long long c[4][100010],sum;
int x[100010],y[100010],n,first[100010],next1[400110],book[100010];
void yao()
{
int book[5];
for(int j=3; j<n; j++)
{
book[1]=book[2]=book[3]=0;
book[x[j-1]]=1;
book[x[j-2]]=1;
for(int i=1; i<=3; i++)
if(!book[i])
{
qq[j].cnt=p[j];
qq[j].c=i;
x[j]=i;
sum+=c[i][p[j]];
break;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(book,0,sizeof(book));
p.clear();
for(int i=0; i<=n; i++)
first[i]=-1;
for(int i=1; i<=3; i++)
for(int j=1; j<=n; j++)
scanf("%lld",&c[i][j]);
int v[200010],u[200010],w=0,a,b;
for(int i=1; i<=n-1; i++)
{
scanf("%d%d",&a,&b);
book[a]++,book[b]++;
u[w]=a,v[w]=b;
next1[w]=first[u[w]];
first[u[w]]=w;
w++;
u[w]=b,v[w]=a;
next1[w]=first[u[w]];
first[u[w]]=w;
w++;
}
int f=0,t;
for(int i=1; i<=n; i++)
if(book[i]>2)
{
f=1;
break;
}
else if(book[i]==1)
t=i;
if(f)
{
printf("-1\n");
continue;
}
memset(book,0,sizeof(book));
int j=first[t];
p.push_back(u[j]);
book[u[j]]=1;
queue<int>q;
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
for(int j=first[t]; j!=-1; j=next1[j])
{
if(book[v[j]])
continue;
q.push(v[j]);
book[v[j]]=1;
p.push_back(v[j]);
}
}
long long minn=0x3f3f3f3f3f3f3f3f;
int dir[6][3]= {1,2,3, 1,3,2, 2,1,3, 2,3,1, 3,2,1, 3,1,2};
for(int i=0; i<6; i++)
{
sum=0;
x[0]=dir[i][0];// 1 3 2
x[1]=dir[i][1];
x[2]=dir[i][2];
qq[0].cnt=p[0],qq[0].c=x[0];
qq[1].cnt=p[1],qq[1].c=x[1];
qq[2].cnt=p[2],qq[2].c=x[2];
sum=(c[x[0]][p[0]])+(c[x[1]][p[1]])+(c[x[2]][p[2]]);
yao();
if(sum<minn)
{
minn=sum;
sort(qq,qq+n,cmp);
for(int j=0; j<n; j++)
y[j]=qq[j].c;
}
}
printf("%lld\n",minn);
for(int i=0; i<n-1; i++)
printf("%d ",y[i]);
printf("%d\n",y[n-1]);
}
return 0;
}

CodeForces - 1244D 树(一条链)的染色的更多相关文章

  1. bzoj2243树链剖分+染色段数

    终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...

  2. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  3. 南昌网络赛 Distance on the tree 主席树+树剖 (给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。)

    https://nanti.jisuanke.com/t/38229 题目: 给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数. #include <bits/stdc++.h ...

  4. CodeForces - 1244D (思维+暴力)

    题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...

  5. hdu4714 Tree2cycle 把树剪成链

    题目是问把一棵树通过剪边.加边形成一个环的最小代价. 分成两步,先把树剪成一些链,再把链连接成一个环. 设一棵有n个节点的树,剪掉X条边后,形成L条链. 那么代价为X+L. n-1-X=edgeNum ...

  6. Ciel the Commander CodeForces - 321C (树, 思维)

    链接 大意: 给定n结点树, 求构造一种染色方案, 使得每个点颜色在[A,Z], 且端点同色的链中至少存在一点颜色大于端点 (A为最大颜色) 直接点分治即可, 因为最坏可以涂$2^{26}-1$个节点 ...

  7. iptables4张表5条链

    4张表:filter nat mangle raw filter:协议过滤: nat:地址转换,端口映射等: mangle:协议修改 TTL等: raw:This  table  is  used m ...

  8. Codeforces 1244D. Paint the Tree

    传送门 首先如果某个点的度数大于 $2$ 那么显然无解 然后考虑点的度数小于等于 $2$ 的情况 发现其实是一条链 一旦确定了链开头的两个点,后面的点的颜色都可以通过之前的点推出 所以直接枚举即可 # ...

  9. CodeForces - 343D 树链剖分

    题目链接:http://codeforces.com/problemset/problem/343/D 题意:给定一棵n个n-1条边的树,起初所有节点权值为0,然后m个操作. 1 x:把x为根的子树的 ...

随机推荐

  1. marquee上下无缝滚动

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...

  2. date成字符串

    //获取当前时间 Date date=new Date(); System.out.println("当前date: "+date); //将时间转化成yyyy-MM-dd格式的字 ...

  3. css 进度条的文字根据进度渐变

    需求 1.进度条里面的文字需要根据进度的长度而变化 原理 用两个一模一样的样式的 div 重叠起来 效果 字体开始为 蓝色,跟随进度条变为 白色 在线预览: https://jsfiddle.net/ ...

  4. vue+express+mysql项目总结(node项目部署阿里云通用)

    原文发布于我的个人博客上:原文点这里   前面经历千辛万苦,终于把博客的所有东西都准备好了,现在就只等部署了.下面我介绍下我的部署过程: 一.购买服务器和域名   如果需要域名(不用域名通过ip也可以 ...

  5. SpringBoot1.5.10.RELEASE整合druid时,在druid monitor界面出现(*) property for user to setup

    接上篇随笔,配置druid之后出现的错误,解决方法如下: @Bean(destroyMethod = "close",initMethod = "init") ...

  6. 第十章、Vue项目的联调上线

    抓包 Fiddler 一.解决跨域 proxyTable(查看博客总结) 二.解决用本机ip地址不能访问 在dev中加上 --host 0.0.0.0就可以用本机ip访问,这样的话可以用手机在内网(局 ...

  7. php -v 找不到命令

    [root@localhost htdocs]# php -v -bash: php: command not found export PATH=$PATH:/usr/local/php7/bin ...

  8. 【vue】---- v-model在自定义组件中的使用

    1. v-model简介 可以用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定,它的本质是一个语法 ...

  9. css 一行自适应等比例布局

    一.浮动布局+百分比 .row { width:100%; overflow:hidden; zoom:1; } .item { float: left; width: 20%; } 该样式兼容性较好 ...

  10. kubeasz部署高可用kubernetes1.17.2 并实现traefik2.1.2部署

    模板机操作 # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # uname -a //内核升级到4.4.X以后, 关于如何 ...