首页 > 其他分享 >题解:P11251 [GESP202409 八级] 美丽路径

题解:P11251 [GESP202409 八级] 美丽路径

时间:2024-11-13 21:18:12浏览次数:3  
标签:结点 GESP202409 int 题解 dpi max P11251 节点 dp

题目传送门

题目大意

给你一颗树,每个结点为黑色或白色。求一条路径,使得路径上距离为奇数的点颜色不同,距离为偶数的点颜色相同,输出这条路径最多能包含多少结点。

思路讲解

容易想到用树形动态规划搭配 dfs 解决。

将结点 1 1 1 设为根节点。设 d p i , 0 dp_{i,0} dpi,0​ 为以结点 i i i 为根节点的子树中,以 i i i 为起点的美丽路径最多包含多少个结点, d p i , 1 dp_{i,1} dpi,1​ 为以结点 i i i 为根节点的子树中,经过结点 i i i 却不以结点 i i i 为起点或终点的美丽路径最多包含多少个结点。

将 d p i , 0 dp_{i,0} dpi,0​ 的初始值设为 1 1 1。我们通过 dfs 搜索结点 i i i 的所有子结点,设当前搜索到的子节点为 j j j,如果 c i ≠ c j c_i \ne c_j ci​=cj​,则说明结点 i i i 可以连接到以结点 j j j 为起点的美丽路径上, d p i , 0 dp_{i,0} dpi,0​ 就等于 max ⁡ ( d p i , 0 , 1 + d p j , 0 ) \max(dp_{i,0},1+dp_{j,0}) max(dpi,0​,1+dpj,0​)。

对于 d p i , 1 dp_{i,1} dpi,1​,容易发现,以结点 i i i 为根节点的子树中,不以 i i i 为起点或终点的美丽路径,其实就是用结点 i i i,将两条以它的颜色不同于它的子节点为起点的路径相连。而要想让其最长,只需取最大的两条即可。

我们可以给结点 i i i 的所有颜色不同于它的子节点 j j j 的 d p j , 0 dp_{j,0} dpj,0​ 从大到小进行排序,或放进一个大根堆中,取最大的两个相加再加 1 1 1 即可(前提是结点 i i i 要有至少 2 2 2 个颜色不同于它的子节点)。

答案为 max ⁡ i = 1 n max ⁡ ( d p i , 0 , d p i , 1 ) \max\limits_{i=1}^{n}\max(dp_{i,0},dp_{i,1}) i=1maxn​max(dpi,0​,dpi,1​)。

代码实现

#include <bits/stdc++.h>
using namespace std;
int n,c[100005],dp[100005][2],ans;
bool to[100005];
vector<int> g[100005];
void dfs(int x){
    to[x]=1;//标记是否被访问过
    int len=g[x].size();
    dp[x][0]=1;//初始化为 1
    priority_queue<int> q;
    for(int i=0;i<len;i++)
        if(!to[g[x][i]]){
        	dfs(g[x][i]);//要先进行 dfs
        	if(c[x]!=c[g[x][i]]){//如果颜色不同
        		dp[x][0]=max(dp[x][0],dp[g[x][i]][0]+1);
            	q.push(dp[g[x][i]][0]);
              //赋值 dp[x][0] 并将其放入堆中
            }
        }
    if(q.size()>1){
      //如果数量大于 1,赋值 dp[x][1]
    	int last=q.top();
    	q.pop();
    	dp[x][1]=1+last+q.top();
	}
    ans=max(ans,max(dp[x][0],dp[x][1]));//统计答案
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1);
    printf("%d",ans);
    return 0;
}

标签:结点,GESP202409,int,题解,dpi,max,P11251,节点,dp
From: https://blog.csdn.net/andycode_/article/details/143752915

相关文章

  • 2021年6月上海月赛T5题解(做基础123题时遇到的)
    平衡点内存限制: 256 Mb时间限制: 1000 ms题目描述给定一个由 n 个整数组成的数列a1​,a2​,⋯,an​,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的力矩尽量接近。若平衡点为 ak​,则左侧力矩定义为数列中下标小于 k 的各个元素到 ak​ 的距离乘以这些元素......
  • 「AT_diverta2019_2_e」Balanced Piles 题解
    题意描述有一个长度为\(N(2\leN\le10^6)\)的数组,一开始所有元素均为\(0\)。设\(M\)为当前数组中的最大元素,\(m\)是当前数组中的最小元素,你可以执行若干次以下操作:选择一个大小为\(m\)的元素,把他变为\(x\),其中\(M\lex\leM+D\)且\(m<x\)。求有多少种操作方法......
  • [ARC105C] Camels and Bridge 题解
    [ARC105C]CamelsandBridge题解https://www.luogu.com.cn/problem/AT_arc105_c记:这是24年夏天在北京梦熊写的(模拟赛撞原),希望这年夏天fowever。sol首先\(n\)很小,所以可以去暴力枚举顺序,也就是全排列。\(W_s\)表示排列为\(s\)时的间距。又令\(f_i\)为前\(i\)只......
  • [题解]P3119 [USACO15JAN] Grass Cownoisseur G
    P3119[USACO15JAN]GrassCownoisseurG显然我们可以先跑强连通分量,由\(x\)个点缩成的新点\(u\)权值为\(v[u]=x\)。下文中的节点\(1\)均表示缩点后节点\(1\)所在的节点。我们在缩点后的DAG上跑拓扑排序,预处理出\(fa[i]\)和\(fb[i]\),分别表示“\(1\)到\(i\)路径的点权和”,“\(i......
  • 洛谷P11228的C++题解
    题目分析题目题目让我们算出机器人走步后经过了多少个不重复的点这道题不是搜索!直接按照题意模拟就行了。遇到墙就向右转,不是就直行。特别注意:向右转也是一步!一个格子最多算一遍!我们可以用一个标记数组 st,走过的点就打上标记。判断走道的点有没有打上标记,有就不......
  • P2779 [AHOI2016初中组] 黑白序列题解
    题意:小可可准备了一个未完成的黑白序列,用B和W表示黑色和白色,用?表示尚未确定。他希望知道一共有多少种不同的方法,在决定了每一个?位置的颜色后可以得到一个小雪喜欢的黑白序列。其中,小雪喜欢的黑白序列指的是对于任何正整数\(n\),由连续\(n\)个黑接上连续\(n\)个白......
  • 题解:CF2025E Card Game
    在这貌似和大部分做法不太一样(?)权当卡特兰数的复习题吧。不会卡特兰数的可以先看文末。如果没有花色\(1\)这道题就很简单了,对于每个别的花色都有\(C(m)\)种分配方案。\(C(n)\)表示卡特兰数的第\(n\)项,答案就是乘起来。发现除了花色\(1\)每种花色的牌都是独立的。这......
  • P6628 [省选联考 2020 B 卷] 丁香之路 题解
    P6628[省选联考2020B卷]丁香之路题解首先考虑题目中路径权值的含义:\(i,j\)两点之间的最短路就是\(|i-j|\)直接连边。题目要求从\(s\)遍历到每个点,到终点每个\(x\)的最短时间。于是我们不妨枚举每个\(x\),考虑在\(O(n)\)至\(O(n\logn)\)的时间复杂度里解决问题......
  • 《统计每个月兔子的总数》 递归、记忆化数组、动态规划题解
    目录题目描述输入描述输出描述解析完整代码描述有一对兔子,从出生后第3个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月(n<=50)的兔子总数为多少对?输入描述输入1个整数n,表示第几个月输出描述第n个月兔子的总数量有多少?......
  • P10833 [COTS 2023] 下 Niz题解
    题意:给定长度为\(N\)的序列\(a\),求满足以下条件的\((l,r)\)对数:\(1\lel\ler\leN\);\(a_l,a_{l+1},\cdots,a_{r-1},a_r\)是\(1\simr-l+1\)的排列。\(1\leN\le10^6\);\(1\lea_i\leN\)。思路首先,“排列”本身这个性质是很强的。因为排列本身需要从1开......