Codeforces 1244D. Paint the Tree
首先如果某个点的度数大于 $2$ 那么显然无解
然后考虑点的度数小于等于 $2$ 的情况
发现其实是一条链
一旦确定了链开头的两个点,后面的点的颜色都可以通过之前的点推出
所以直接枚举即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e5+;
const ll INF=1e18;
int fir[N],from[N<<],to[N<<],cntt;
inline void add(int a,int b) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; }
int n,cst[N][],ans[][],col[N],pcol[N],du[N];
vector <int> V;
int main()
{
n=read();
for(int i=;i<;i++)
for(int j=;j<=n;j++) cst[j][i]=read();
for(int i=;i<n;i++)
{
int a=read(),b=read();
add(a,b); add(b,a);
du[a]++; du[b]++;
}
for(int i=;i<=n;i++)
if(du[i]>) { printf("-1\n"); return ; }
int rt=; for(int i=;i<=n;i++) if(du[i]==) { rt=i; break; }
int pre=rt,now=to[fir[rt]]; V.push_back(rt);
while(du[now]>)
for(int i=fir[now];i;i=from[i])
{
int &v=to[i]; if(v==pre) continue;
V.push_back(now); pre=now; now=v; break;
}
V.push_back(now);
ll ans=INF;
for(int i=;i<;i++)
for(int j=;j<;j++) if(i!=j)
{
int len=V.size(); ll res=cst[V[]][i]+cst[V[]][j];
pcol[V[]]=i; pcol[V[]]=j;
for(int k=;k<len;k++)
{
for(int c=;c<;c++)
if(c!=pcol[V[k-]]&&c!=pcol[V[k-]]) pcol[V[k]]=c;
res+=cst[V[k]][pcol[V[k]]];
}
if(res<ans)
for(int k=;k<len;k++) col[V[k]]=pcol[V[k]];
ans=min(ans,res);
}
printf("%lld\n",ans);
for(int i=;i<=n;i++) printf("%d ",col[i]+);
puts(""); return ;
}
Codeforces 1244D. Paint the Tree的更多相关文章
- Codeforces 1240C. Paint the Tree
传送门 首先每个点 $u$ 只能选择不超过 $k$ 个相连的边 并且设边为 $(u,v)$ ,那么此时 $v$ 也必须选择这条边 因为图是一颗树,显然考虑一下树形 $dp$ 设 $f[x][0/1]$ ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
- Paint the Tree
Paint the Tree 题目来源: Moscow Pre-Finals Workshop 2018 Day 5 C 题目大意: 一棵\(n(n\le2000)\)个点的树,有\(m(2<m ...
- Codeforces 1129 E.Legendary Tree
Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1\) 次 \((S=\{1\},T=\{ ...
- Codeforces 280C Game on tree【概率DP】
Codeforces 280C Game on tree LINK 题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数 #inclu ...
- Codeforces A. Game on Tree(期望dfs)
题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- E. Paint the Tree 树形dp
E. Paint the Tree 题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说 这条边是饱和的,一个树的价值 ...
- Codeforces Round #781(C. Tree Infection)
Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...
- Codeforces 196C Paint Tree(贪心+极角排序)
题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...
随机推荐
- Java虚拟机与平台无关性
概述 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. --<深入理解Java虚拟机>(从这里可以看到,字节码是一种文件格式) 我们都知道计算机只 ...
- OUC_Summer Training_ DIV2_#11 722
企鹅很忙系列~(可惜只会做3道题T_T) A - A Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d &am ...
- Nginx数据结构之散列表
1. 散列表(即哈希表概念) 散列表是根据元素的关键码值而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录, 以加快查找速度.这个映射函数 f 叫做散列方法,存放记录的数 ...
- R语言:怎么进行异常检测
a <- try(as.Date('2017-02-30'),silent = T) 当silent为F是,错误消息还是会返回 怎么检测a是否出错呢:if('try-error' %in% cl ...
- ci框架总结(一)
在进行数据库操作前一定要先初始化数据库类:$this->load->database(); 在model类中: class Myiapp_model extends CI_Model{ p ...
- centos 如何查看命令是由哪个包提供的
yum whatprovides */ifconfig Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ...
- springBoot2.X---过滤器,监听器,拦截器
过滤器,监听器,拦截器 一.画图理解 过滤器(filter),监听器(listener),拦截器(Interceptor). 通过两幅图我们可以理解拦截器和过滤器的特点 1.过滤器 过滤器是在请求进入 ...
- 语法错误 : 缺少“;”(在“<”的前面)
该错误有可能是由错误所指行“<”附近的某个类型忘记#include <>所造成的
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上
笔记 3.Feign结合Hystrix断路器开发实战<上> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖 注意:网上新旧版本问 ...