清北学堂模拟赛d3t6 c

清北学堂模拟赛d3t6 c分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

清北学堂模拟赛d3t6 c

分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么转移f[i][0],如果i不与父节点相连,那么i肯定与两个子节点相连,其它的子节点都不与父节点相连,而且要剪掉与父亲节点的一条边,所以f[i][0] = (Σf[j][0]) – f[p][0] – f[q][0] + f[p][1] + f[q][1] – 1.f[i][1]也能很容易推导出来f[i][1] = (Σf[j][0]) – f[p][0] + f[p][1].这两个式子中的p,q使我们选出来与i组成链的子节点,为了使得f[i][0/1]最小,我们要选出使f[j][1] – f[j][0]最小的p,q,这个在枚举的时候扫一下就可以了.

     最后是合并,一个树有N-1条边,先不断地删边,然后加边,加到N-1条边,最后再补一条边形成一个环,可以发现删边和加边是对称的,需要删掉链-1条边,那么也需要加上链-1条边,最后用一条边形成一个环就可以了.

树形dp,考虑好链的种类和怎么从子节点转移,充分利用好加边和删边的对称性,就能A掉此题,最关键的还是状态的表示,树形dp可能会需要保存不同的状态,如果对于当前状态推不下去了,就多加点状态,直到可做为止.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int inf = 0x7fffffff;

int n, head[100010], to[200010], nextt[200010], tot = 1, f[100010][2];

void add(int x, int y)
{
    to[tot] = y;
    nextt[tot] = head[x];
    head[x] = tot++;
}

void dfs(int u, int from)
{
    int min1 = inf, min2 = inf,son = 0,sum = 0,sum2 = 0;
    for (int i = head[u]; i; i = nextt[i])
    {
        int v = to[i];
        if (v != from)
        {
            dfs(v, u);
            son++;
            sum += f[v][0];
            sum2 += f[v][1];
            int temp = f[v][1] - f[v][0];
            if (temp < min1)
            {
                min2 = min1;
                min1 = temp;
            }
            else
                if (temp < min2)
                    min2 = temp;
        }
    }
    if (son == 0)
        f[u][0] = f[u][1] = 1;
    if (son == 1)
        f[u][0] = f[u][1] = sum2;
    else
        if (son >= 2)
        {
        f[u][0] = sum + min1 + min2 - 1;
        f[u][1] = sum + min1;
        }
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i < n; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        add(u, v);
        add(v, u);
    }
    dfs(1, 0);
    printf("%d\n", f[1][0] * 2 - 1);

    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166563.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 高等数学:第五章 定积分(2)换元积分法 分部积分法 广义积分

    高等数学:第五章 定积分(2)换元积分法 分部积分法 广义积分§5.4  定积分的换元法一、换元公式【定理】若1、函数在上连续;2、函数在区间上单值且具有连续导数;3、当在上变化时,的值在上变化,且 ,  则有                          (1)证明:(1)式中的被积函数在其积分区间上均是连续,故(1)式两端的定积分存在。且(1)式两端的被积函数的原函数均是存在的。假设是在上的一个原函数,据

    2025年5月26日
    3
  • Python基础之lambda表达式

    Python基础之lambda表达式目录1、lambda函数介绍2、lambda函数与def函数的区别3、lambda案例4、map方法混搭有时在使用函数时不需要给函数分配一个名称,该函数就是“匿名函数”。在python中使用lambda表达式表示匿名函数语法:lambda参数列表:lambda体lambda是关键字声明,在lambda表达式中,参数列表与函数中的参数列表一样,但不需要用小括号括起来,冒号后面是lambda体,lambda表达式的主要代码在lambda体处编写,类似于函数体。提示:lambda体不能是一个代码块,不能包含多条

    2022年10月17日
    3
  • windows环境下,如何在Pycharm下安装TensorFlow环境「建议收藏」

    windows环境下,如何在Pycharm下安装TensorFlow环境「建议收藏」原文转自:https://blog.csdn.net/u012052268/article/details/74202439最近由于工作需要要使用TensorFlow,所以只能狂补相关的知识。本来博主打算在Ubantu上玩,但是由于一些原因还是放弃了这个想法,就转移到Pycharm上来玩。以下是自己在收集资料的过程中看到一篇很好的安装教程,分享一下。1.安装Anaconda选择相应的A…

    2022年8月25日
    5
  • ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)

    ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)摘自:https://blog.csdn.net/zouxu634866/article/details/106287879#comments_12978720ADRC自抗扰控制自学笔记(包含simulink仿真)总被蚊子叮的小旭2020-05-2217:59:361856收藏28分类专栏:控制版权ADRC控制中包含三个主要的部分:跟踪微分器,非线性状态反馈(非线性组合),扩张观测器。ADRC特点:继承了经典PID控制器的精华,对被控对…

    2022年5月19日
    79
  • jvm垃圾回收算法有哪些_jvm垃圾回收过程

    jvm垃圾回收算法有哪些_jvm垃圾回收过程JVM垃圾回收算法两个概念:新生代:存放生命周期较短的对象的区域。老年代:存放生命周期较长的对象的区域。相同点:都在Java堆上1.标记–清除算法执行步骤:标记:遍历内存区域,对需要回收的对象打上标记。清除:再次遍历内存,对已经标记过的内存进行回收。图解:缺点:效率问题;遍历了两次内存空间(第一次标记,第二次清除)。空间问题:容易产生大量内存碎片,当再需要一块比…

    2022年9月11日
    1
  • 庆祝kkkbo出道!

    庆祝kkkbo出道!希望学编程有始有终,不做弱者,不做断者-常思华联兴之日子,多念华联兴之饭菜,忆图思苦,勉励自身。

    2022年7月3日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号