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为根的子树的 ...
随机推荐
- Mysql或者SQL Server数据库的运行机制和体系架构
一.MySQL主要分为以下几个组件: 连接池组件 管理服务和工具组件 SQL接口组件 分析器组件 优化器组件 缓冲组件 插件式存储引擎 物理文件 二.MySql的组成:Mysql是由SQL接口,解析器 ...
- Java 在PDF中添加表格
本文将介绍通过Java编程在PDF文档中添加表格的方法.添加表格时,可设置表格边框.单元格对齐方式.单元格背景色.单元格合并.插入图片.设置行高.列宽.字体.字号等. 使用工具:Free Spire. ...
- 【Geek议题】当年那些风骚的跨域操作
前言 现在cross-origin resource sharing(跨域资源共享,下简称CORS)已经十分普及,算上IE8的不标准兼容(XDomainRequest),各大浏览器基本都已支持,当年为 ...
- VUE实现Studio管理后台(十三):按钮点选输入控件,input输入框系列
按钮点选输入,是一个非常简单的控件,20分钟就能完成的一个控件.先看效果: 根据以前的设定,通过json数据动态生成这两个按钮,示例中这两个按钮对应的json代码: { label:'标题', val ...
- 选择结构二switch选择结构
在上一章节我们讲解了if选择结构 本章我们学习 switch选择结构 还要知道if选择结构和switch结构的区别 为什么学习了if选择结构还要学习switch选择结构 以及 两种选择结构的运用 ...
- Nginx之负载均衡配置(一)
前文我们聊了下nginx作为反向代理服务器,代理后端动态应用服务器的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12430543.html:今天我们来聊 ...
- 面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...
- chrome 和 chromeDriver
在写selenium的时候,发现很简单的case也报错 package com.lv.test; import org.junit.Test; import org.openqa.selenium.W ...
- MATLAB神经网络(7) RBF网络的回归——非线性函数回归的实现
7.1 案例背景 7.1.1 RBF神经网络概述 径向基函数是多维空间插值的传统技术,RBF神经网络属于前向神经网络类型,网络的结构与多层前向网络类似,是一种三层的前向网络.第一层为输入层,由信号源结 ...
- Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...