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为根的子树的 ...
随机推荐
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Java入门教程六(内置包装类)
Java 是一种面向对象的编程语言,Java 中的类把方法与数据类型连接在一起,构成了自包含式的处理单元.但在 Java 中不能定义基本类型对象,为了能将基本类型视为对象处理,并能连接相关方法,Jav ...
- java ThreadPoolExecutor初探
导读:线程池是开发中使用频率比较高的组件之一,但是又有多少人真正了解其内部机制呢. 关键词:线程池 前言 线程池是大家开发过程中使用频率比较高的组件之一,但是其内部原理又有多少人真正清楚呢.最近抽时间 ...
- HTTP&ServletContext&Response对象_文件上传
今日内容 1. HTTP协议:响应消息 2. Response对象 3. ServletContext对象 HTTP协议 1. 请求消息:客户端发送给服务器端的数据 * 数据格式: 1. 请求行 2. ...
- 前端每日实战:111# 视频演示如何用纯 CSS 创作一只艺术的鸭子
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/aaoveW 可交互视频 此视频是可 ...
- 解决IOS下window.open页面打不开问题
问题如标题所写,在ajax回调里面拿到即将要跳转的链接url,使用window.open(linkUrl),没有起作用,而且代码也没有报错,查找原因是:大部分现代的浏览器(Chome/Firefox/ ...
- Redux 架构理解
Redux 是一种前端“架构模式”,是 Flux 架构的一种变种,用来提供可预测的状态管理.虽然经常和 React 一起被提及,但是 Redux 却不仅仅只能用于 React,还可以将其运用到其他前端 ...
- activiti设置customSessionFactories时的一个小坑
现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...
- 【10】openlayers 视图view
创建地图: //View对象代表地图的简单2D视图 //创建view let view = new ol.View({ center:[109,34],//视图的初始中心 maxZoom:18,//最 ...
- model进阶
本节目录 一 QuerySet 二 中介模型 三 查询优化 四 extra 五 整体插入 一 QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMI ...