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为根的子树的 ...
随机推荐
- 使用Properties配置文件进行配置读取
#使用Properties配置文件进行配置读取: 例如:有一个配置文件的内容如下: # setting.properties last_open_file=/data/hello.txt auto_s ...
- go语言指南之斐波纳契闭包
练习:斐波纳契闭包 让我们用函数做些好玩的事情. 实现一个 fibonacci 函数,它返回一个函数(闭包),该闭包返回一个斐波纳契数列 `(0, 1, 1, 2, 3, 5, ...)`. 这是一个 ...
- SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- MVC04
1. 从页面到action 讲述controller与View之间的具体运作关系 在上次添加的名为Movie的Model内添加 下面我们尝试为该model内的属性添加attribute 具体修改如下: ...
- Linux学习资料地址汇总-不定时更(一)
https://linux.linuxidc.com/ 用户名和密码都是www.linuxidc.com
- 内网渗透之跨边界传输 - LCX转发
跨边界转发 端口转发 lcx 流程 目标机 ./lcx -slave 跳板机ip 监听的端口 127.0.0.1 要转发的端口 跳板机(公网) ./lcx -listen 监听的端口 转发给攻击机访问 ...
- python爬虫的数据库连接问题
1.需要导的包 import pymysql 2.# mysql连接信息(字典形式) db_config ={ 'host': '127.0.0.1',#连接的主机id(107.0.0.1是本机id) ...
- JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...
- C++ 标准模板库(STL)-stack
主要介绍一下C++11版本中标准模板库中栈的用法,希望可以帮到需要用的人. #include <iostream> #include <stack> #include < ...
- MySQL记录操作(增删改)
概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据 ...