CodeForces - 1244D 树(一条链)的染色
题意:给一个无向的无环的树,需要用三种颜色将他染色,相邻的三个点不能有重复的颜色。给出每个点染成每种颜色的花费,求最小的染色花费,如果给的图不能按要求染色,输出-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 树(一条链)的染色的更多相关文章
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- Water Tree CodeForces 343D 树链剖分+线段树
Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...
- 南昌网络赛 Distance on the tree 主席树+树剖 (给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。)
https://nanti.jisuanke.com/t/38229 题目: 给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数. #include <bits/stdc++.h ...
- CodeForces - 1244D (思维+暴力)
题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...
- hdu4714 Tree2cycle 把树剪成链
题目是问把一棵树通过剪边.加边形成一个环的最小代价. 分成两步,先把树剪成一些链,再把链连接成一个环. 设一棵有n个节点的树,剪掉X条边后,形成L条链. 那么代价为X+L. n-1-X=edgeNum ...
- Ciel the Commander CodeForces - 321C (树, 思维)
链接 大意: 给定n结点树, 求构造一种染色方案, 使得每个点颜色在[A,Z], 且端点同色的链中至少存在一点颜色大于端点 (A为最大颜色) 直接点分治即可, 因为最坏可以涂$2^{26}-1$个节点 ...
- iptables4张表5条链
4张表:filter nat mangle raw filter:协议过滤: nat:地址转换,端口映射等: mangle:协议修改 TTL等: raw:This table is used m ...
- Codeforces 1244D. Paint the Tree
传送门 首先如果某个点的度数大于 $2$ 那么显然无解 然后考虑点的度数小于等于 $2$ 的情况 发现其实是一条链 一旦确定了链开头的两个点,后面的点的颜色都可以通过之前的点推出 所以直接枚举即可 # ...
- CodeForces - 343D 树链剖分
题目链接:http://codeforces.com/problemset/problem/343/D 题意:给定一棵n个n-1条边的树,起初所有节点权值为0,然后m个操作. 1 x:把x为根的子树的 ...
随机推荐
- GitLab-CI部署及踩坑总结
转载请注明出处:https://www.cnblogs.com/shining5/p/8863063.html 部署GitLab-CI 简介 GitLab_CI(gitlab continuous i ...
- xshell6使用的命令
我们进入Xshell的界面之后连接上Linux服务器 常用命令: (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下 ...
- Docker Compose 项目打包部署
Docker Compose 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器.然而微服务架构的应用系统一 ...
- 【前端性能优化】高性能JavaScript整理总结
高性能JavaScript整理总结 关于前端性能优化:首先想到的是雅虎军规34条然后最近看了<高性能JavaScript>大概的把书中提到大部分知识梳理了下并加上部分个人理解这本书有参考雅 ...
- 关于Html+css阶段学习总结
一.学习经历 进入大学不久,就加入了社团,从而对前端有了一个初步的了解,之后也做过一些学校的官网,积累了一些微小的经验. 到了大二的时候,学校开设了专门的html+css课程,从中也学到许多新的htm ...
- PYTHON 第二天学习记录
- [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
题目: 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + . ...
- flask 模型一对多个人理解
在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...
- Linux下MongoDB单实例的安装和配置详解
推荐网站 MongoDB官网:http://www.mongodb.org/ MongoDB学习网站:http://www.runoob.com/mongodb 一.创建MongoDB的资源目录和安装 ...
- C语言程序设计(十二) 结构体和共用体
第十二章 结构体和共用体 当需要表示复杂对象时,仅使用几个基本数据类型显然是不够的 根本的解决方法是允许用户自定义数据类型 构造数据类型(复合数据类型)允许用户根据实际需要利用已有的基本数据类型来构造 ...