Paint the Tree CodeForces - 1244D(看似是树,其实是条链)

目录

  • 题目
  • 官方题解:
  • 百度翻译
  • 题解
  • ac代码

题目

给多组两顶点连接,得到的图任意三个顶点都是不同的颜色,,给出各顶点染三种颜色的花费,问各店如何染,满足条件情况下,使得花费最少;

You are given a tree consisting of nn vertices. A tree is an undirected connected acyclic graph.
在这里插入图片描述
Example of a tree.
You have to paint each vertex into one of three colors. For each vertex, you know the cost of painting it in every color.

You have to paint the vertices so that any path consisting of exactly three distinct vertices does not contain any vertices with equal colors. In other words, let’s consider all triples (x,y,z) such that x≠y,y≠z,x≠z, x is connected by an edge with yy, and yy is connected by an edge with zz. The colours of x, y and z should be pairwise distinct. Let’s call a painting which meets this condition good.

You have to calculate the minimum cost of a good painting and find one of the optimal paintings. If there is no good painting, report about it.

Input
The first line contains one integer nn (3≤n≤100000)— the number of vertices.

The second line contains a sequence of integers c1,1,c1,2,…,c1,n(1≤c1,i≤109^{9}9), where c1,i is the cost of painting the ii-th vertex into the first color.

The third line contains a sequence of integers c2,1,c2,2,…,c2,n)(1≤c2,i≤109^{9}9), where c2,iis the cost of painting the ii-th vertex into the second color.

The fourth line contains a sequence of integers c3,1,c3,2,…,c3,n(1≤c3,i≤109^{9}9), where c3,i is the cost of painting the i-th vertex into the third color.

Then (n−1) lines follow, each containing two integers ujuj and vjvj (1≤uj,vj≤n,uj≠vj) — the numbers of vertices connected by the jj-th undirected edge. It is guaranteed that these edges denote a tree.

Output
If there is no good painting, print −1.

Otherwise, print the minimum cost of a good painting in the first line. In the second line print nn integers b1,b2,…,bn (1≤bi≤3), where the ii-th integer should denote the color of the ii-th vertex. If there are multiple good paintings with minimum cost, print any of them.

Examples
Input
3
3 2 3
4 3 2
3 1 3
1 2
2 3
Output
6
1 3 2
Input
5
3 4 2 1 2
4 2 1 5 4
5 3 2 1 1
1 2
3 2
4 3
5 3
Output
-1
Input
5
3 4 2 1 2
4 2 1 5 4
5 3 2 1 1
1 2
3 2
4 3
5 4
Output
9
1 3 2 1 3
Note
All vertices should be painted in different colors in the first example. The optimal way to do it is to paint the first vertex into color 1, the second vertex — into color 3, and the third vertex — into color 2. The cost of this painting is 3+2+1=6.

官方题解:

在这里插入图片描述

百度翻译

关键的观察是,如果我们确定了两个相邻顶点xx和yy的颜色,那么与xx或yy相邻的任何顶点的颜色只能是6-cx-cy。因此,我们可以确定任何边的端点的颜色(有6种可能这样做),然后对所有其他顶点进行遍历,然后再做一次遍历来检查我们是否有一幅好画。

为了避免检查我们得到的画是否好(这可能很难编码),我们可以使用这样一个事实:对于每个顶点,其所有相邻顶点的颜色应该彼此不同,并且与我们固定的顶点的颜色不同。所以,如果某个顶点的度数大于等于3,那么就没有好的画;否则我们得到的画就是好的,因为图是一个链。

题解

(1)如果满足条件,则一个顶点上最多只有两条边,所以该各顶点可连接后是一条链,所以判断若有点超过两个链接,则判为不存在;
(2)由于要找出最小花费的染色方案,则需遍历所有可能存在染色情况,找出最优方案。若为一条链,且只有三种颜色,找出头或尾(只有一个连接)确定两个颜色即可确定另一个,所以共有三种情况。
(3)注意一下,因为双向的,所以用过某条边之后,不能再用,否则会造成错误,链中存在环。

ac代码

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int M=1e5+10;
int n;
int a[4][M];
vector<int> e[M];///记录某点连接的的其他点
ll s;
int t[M], c[M], dp[M];///c[M]为(1~n)个点的颜色,t[M]是成链每一步的颜色,记录最优解各点的颜色
void dfs(int cur, int par, int step)///cur当前点,par之前出现的点(防止双向成环),链上的第几个点
{if(step>=3)t[step] = 6-t[step-1]-t[step-2];c[cur] = t[step];s+=a[t[step]][cur];for(int i=0; i<e[cur].size(); i++)///i从零开始{int nxt = e[cur][i];if(nxt==par)///防止双向成环continue;dfs(nxt, cur, step+1);}
}
int main()
{scanf("%d", &n);for(int i=1; i<=3; i++)for(int j=1; j<=n; j++)scanf("%d", &a[i][j]);for(int i=1; i<n; i++){int x, y;scanf("%d%d", &x, &y);e[x].push_back(y);e[y].push_back(x);}bool flag = true;int st = 1;for(int i=1; i<=n; i++){if (e[i].size() > 2)flag = false;if (e[i].size() == 1)st = i;}if (!flag){puts("-1");return 0;}ll ans =-1;///长整形,不能用0x3f3f3f3f来代表无穷大故为-1for(t[1] = 1; t[1]<=3; t[1]++)for(t[2] = 1; t[2]<=3; t[2]++){if(t[2]==t[1])continue;s = 0;dfs(st, 0, 1);if (ans > s||ans<0){ans = s;for(int i=1; i<=n; i++)dp[i] = c[i];}}printf("%lld\n", ans);for(int i=1; i<n; i++)printf("%d ", dp[i]);printf("%d\n",dp[n]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[设计模式]简单工厂模式

简单工厂模式优点: 1.客户端和具体实现解耦 2.对于某些对象的创建过程比较复杂的情况&#xff0c;我们不用考虑这些。 简单工厂模式缺点: 1.简单工厂模式&#xff0c;增加新的功能是通过修改源代码实现&#xff0c;不符合开闭原则。 2.这个工厂(类)职责过重&#xff0c;这个…

什么前浪后浪,我们只不过是时代大潮中的一朵小浪花

这是头哥侃码的第198篇原创上周的五四青年节&#xff0c;我的朋友圈被一个短视频刷屏了&#xff0c;不知道你的朋友圈有没有被刷到&#xff1f;这个短视频来自小破站B站的一则宣传视频《后浪》。我是B站的老用户&#xff0c;所以在看完视频后&#xff0c;我特地跑到B站看了下&a…

java上GUI表格按钮,java GUI表格实例

1 package javademo;2 import java.awt.*;3 import javax.swing.*;4 import java.awt.event.*;5 public class table3{6 JFrame framenew JFrame("表格实例");7 Object [][]date {{"李明",45,"计算机"},{8 "小王",32,"数学"…

[设计模式]工厂方法模式

工厂方法模式缺点: 1.类的个数成倍增加&#xff0c;导致类越来越多&#xff0c;增加维护成本。 2.增加了系统的抽象性和理解难度。 (判断生产什么&#xff0c;又变成让客户端来判断了&#xff0c;简单工厂模式是由工厂判断) 工厂方法模式优点: 1.符合开闭原则。 简单工厂模式…

Asp.Net Boilerplate微服务实战(二)架构解析

这一章节&#xff0c;我来介绍一下Asp.Net Boilerplate框架在微服务开发中所用到的技术及其大体的组织架构。由于本系列仅讨论ABP框架在微服务架构下的应用方案&#xff0c;不涉及具体的业务逻辑&#xff0c;所以在文中&#xff0c;不讨论服务拆分方案等细节&#xff0c;也未采…

c#: 协变和逆变深度解析

环境&#xff1a;window 10.netcore 3.1vs2019 16.5.1一、为什么要有协变&#xff1f;首先看下面的代码&#xff1a;还有下面的&#xff1a;其实上面报错的是同一个问题&#xff0c;就是你无法用List<Fruit>指向List<Apple>&#xff01;我们的疑问在于&#xff0c;…

[设计模式]抽象工厂模式

抽象工厂模式针对的是产品族&#xff0c;而不是产品等级结构。 产品族:同一产地或者同一产商&#xff0c;功能不同。 产品等级:功能相同&#xff0c;产地或者厂商不同。 代码如下: #include <iostream> using namespace std;class AbstractApple { public:virtual vo…

.net core HttpClient 使用之掉坑解析(一)

一、前言在我们开发当中经常需要向特定URL地址发送Http请求操作&#xff0c;在.net core 中对httpClient使用不当会造成灾难性的问题&#xff0c;这篇文章主要来分享.net core中通过IHttpClientFactory 工厂来使用HttpClient的正确打开方式。二、HttpClient使用中的那些坑2.1 错…

linux常用命令 java,Java工程在Linux常用命令

Java Web工程 在Linux下操作常用命令cd ../ 退出当前目录,前往父文件夹cd ezoffice 进入ezoffice文件夹ls 查看目录ps -ef|grep java 查看JAVA进程ps -aux |grep tomcat 查看tomcat进程 的进程号kill -9 12222 杀死ID为12222进程nohup ./startup.sh & 执行startup.sh&…

[设计模式]单例模式(懒汉式,饿汉式)

实现单例步骤: 1.构造函数私有化。 2.增加静态私有的当前类的指针变量。 3.提供静态对外接口&#xff0c;可以让用户获得单例对象。 单例 分为&#xff1a; 1.懒汉式 2.饿汉式 懒汉式 代码如下: class Singleton_lazy { public:static Singleton_lazy *getInstance(){if (pS…

我擦!没想到你们都是这样 “劝退” 员工的!

前几天&#xff0c;我的一个好哥们在微信上跟我吐槽&#xff0c;说这波疫情对经济的影响实在太大了。他说在往年&#xff0c;这个时候跳槽应该开始冒头了&#xff0c;而今年从春节到现在&#xff0c;除了少数几个被裁员之外&#xff0c;200多人的技术团队几乎就没一个主动提离职…

[设计模式]代理模式

代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作业。 代码如下: #include <iostream> using namespace std;//共有接口 …

IO 模型知多少 | 代码篇

引言之前的一篇介绍IO 模型的文章IO 模型知多少 -- 理论篇比较偏理论&#xff0c;很多同学反应不是很好理解。这一篇咱们换一个角度&#xff0c;从代码角度来分析一下。socket 编程基础开始之前&#xff0c;我们先来梳理一下&#xff0c;需要提前了解的几个概念&#xff1a;soc…

[设计模式]外观模式

外观模式:为一组具有类似功能的类群&#xff0c;比如类库&#xff0c;子系统等等&#xff0c;提供一个一致的简单的界面。 代码如下: #include <iostream> using namespace std;class Television { public:void on(){cout << "Tv on" << endl;}v…

Keywords Search HDU - 2222(AC自动机模板)

题意&#xff1a; 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询&#xff0c;以及一篇文章&#xff0c;问&#xff1a;文中出现了多少个待查询的单词。多组数据。 题目&#xff1a; In the modern time, Search engine came into the life of everybody like Go…

介绍一个基于 .NET 的船的新 PHP SDK + Runtime: PeachPie

前言这几天想基于 .NET Core 搞一个自己的博客网站&#xff0c;于是在网上搜刮各种博客引擎&#xff0c;找到了这些候选&#xff1a;Blogifier、Miniblog 以及 edi 写的 Moonglade。Blogifier&#xff1a;这是前端是个 Angular SPA 应用&#xff0c;不利于 SEO&#xff0c;同时…

[设计模式]适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 &#xff08;将已经写好的&#xff0c;但是不符合需求的接口&#xff0c;转换成目标接口&#xff09; 代码如下: #include <iostream>…

[工具]微软的学习平台Microsoft Learn很好用,推荐一下

1. 什么是Microsoft LearnMicrosoft Learn是微软这两年大力推广的全新学习平台&#xff0c;可提供 Microsoft 产品交互式学习体验。基本上无需登录即可使用&#xff0c;但登录后可以使用更多功能&#xff0c;包括&#xff1a;累积分数和成就跟踪学习活动进度使用免费的 Azure 资…

多终端数据同步机制设计

多终端数据同步机制设计之前写过一篇文章数据同步流程设计的文章&#xff0c;这里整理一下在公众号里分享一下Intro因为项目需要&#xff0c;需要设计一个多终端数据同步的机制&#xff0c; 需要满足以下条件&#xff1a;多个终端数据操作及同步&#xff0c;终端可能离线每次同…

Popular Cows POJ - 2186(tarjan算法)+详解

题意&#xff1a; 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N头牛&#xff0c;给你M对整数&#xff08;A,B&#xff09;&#xff0c;表示牛 A认为牛B受欢迎。这种关系是具有传递性的&#xff0c;如果 A认为 B受欢迎&#xff0c; B认为 C受欢迎&#xff0c;那么牛 A也认…