发现给出了一棵树, 不是树的情况直接输出-1

考虑进行DP, 设f[i][0/1/2]为i的子树中选小于等于0/1/2条边修路的方案数, 不妨对于一个节点, 先考虑正好相等的情况, 假设当前扫到了一个节点v, 则有

\[f[i][0] = \max\{f[i][0]\, f[v][2]+1\} \\
f[i][1] = \min\{\max\{f[i][1], f[v][2]+1\}, \max\{f[i][0], f[v][1]\}\} \\
f[i][2] = \min\{\max\{f[i][2], f[v][2]+1\}, \max\{f[i][1], f[v][1]\}\}
\]

接下来前缀min一下即可, 注意到要2->1->0更新, 并且要前缀min

接下来考虑DP出方案数, 发现我们所求的f[1][2]的最大值是\(O(log_3 n) \leq 11\)的, 因此设计状态时要把这个作为一个维度

咕咕咕

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define _ 100005
#define rep for(int t=0; t<=f[1][2]; ++t)
int f[_][3], g[_][20][3], inf=0x3f3f3f3f;
int Next[_<<1], ver[_<<1], head[_], tot;
int n, m, q;
int gv(int x, int y, int z){
if(x>=0 && y>=0 && z>=0) return g[x][y][z]; return 0;
}
void dfs1(int u, int fa){
f[u][0] = 0, f[u][1] = inf, f[u][2] = inf;
for(int i=head[u]; i; i=Next[i]){
int v=ver[i]; if(v == fa) continue; dfs1(v, u);
f[u][2] = min(max(f[u][2], f[v][2]+1), max(f[u][1], f[v][1]));
f[u][1] = min(max(f[u][1], f[v][2]+1), max(f[u][0], f[v][1]));
f[u][0] = max(f[u][0], f[v][2]+1);
}
f[u][1] = min(f[u][0], f[u][1]); f[u][2] = min(f[u][2], f[u][1]);
}
void dfs2(int u, int fa){
rep g[u][t][0]=1, g[u][t][1]=g[u][t][2]=0;
for(int i=head[u]; i; i=Next[i]){
int v=ver[i]; if(v == fa) continue; dfs2(v, u);
rep {
g[u][t][2] = gv(u, t ,2)*gv(v, t-1, 2) + gv(u, t, 1)*gv(v, t, 1); g[u][t][2]%=q;
g[u][t][1] = gv(u, t, 1)*gv(v, t-1, 2) + gv(u, t, 0)*gv(v, t, 1); g[u][t][1]%=q;
g[u][t][0] = gv(u, t, 0)*gv(v, t-1, 2); g[u][t][0]%=q;
}
}
rep (g[u][t][1]+=g[u][t][0])%=q, (g[u][t][2]+=g[u][t][1])%=q;
}
void add(int u, int v){
ver[++tot]=v, Next[tot]=head[u], head[u]=tot;
}
signed main(){
scanf("%lld%lld%lld", &n, &m, &q);
if(m != n-1) return (puts("-1"), puts("-1"), 0);
for(int i=1; i<=m; ++i){
int x, y; scanf("%lld%lld", &x, &y); add(x, y); add(y, x);
}
dfs1(1, 0); dfs2(1, 0);
printf("%lld\n%lld\n", f[1][2], gv(1, f[1][2], 2));
}

题解P4201: [NOI2008]设计路线的更多相关文章

  1. [NOI2008]设计路线

    题目 洛谷 BZOJ 做法 神仙题 显然这是棵树 个节点相东仅连接一个结点 不同于剖分,还能存在\("V"\)字型,一个节点最多与另外节点连两条边 \(dp[i][j][k]\)表 ...

  2. 洛谷 P4201 设计路线 [NOI2008] 树形dp

    正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...

  3. [题解]codevs1001 舒适的路线

    h3 { font-family: Consolas; color: #339966 } .math { font-family: Consolas; color: gray } 题目描述 Descr ...

  4. [luogu4201][bzoj1063]设计路线【树形DP】

    题目描述 Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是Z国的每个城市所处的经度都不相同,并且最多只和一 ...

  5. 【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

    @ACMLCZH学长出的毒瘤题T3.再也不是“善良”的出题人了. 题意:bzoj. 题解: 经典的树形DP题目,屡见不鲜了,然而我还是没有写出来. 这一类的题目有很多,例如这里的C题. 主要套路是把对 ...

  6. P4201-[NOI2008]设计路线【结论,树形dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4201 题目大意 给出\(n\)个点的一棵树开始所有边都是白色,选出若干条没有公共点的路径将上面所有边变为黑色. ...

  7. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...

  8. Spring IoC容器的设计—1—主线

    IoC容器的接口设计图 下面对接口关系做一些简要的分析,可以依据以下内容来理解这张接口设计图. 从接口BeanFactory到HierarchicalBeanFactory,再到Configurabl ...

  9. 1063: [Noi2008]道路设计 - BZOJ

    Description Z 国坐落于遥远而又神奇的东方半岛上,在小Z 的统治时代公路成为这里主要的交通手段.Z 国共有n 座城市,一些城市之间由双向的公路所连接.非常神奇的是Z 国的每个城市所处的经度 ...

随机推荐

  1. grep -o -E

    sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的.其中 -o 表示“only-matching”,即“仅匹配”之意.光用它 ...

  2. C语言中指针和取地址符&的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  3. axios和fetch

    前面的vuex提到了异步请求,在vue里异步请求怎么请求呢,很显然jq.ajax是不用了,不是不能用,而是没必要,jq是操作dom的工具,强行用浪费功能,还会加大打包后的体积,而且是没有promise ...

  4. List<string>绑定到DataGridView控件

    问题 将一个简单的List<string>作为数据源绑定到 DataGridView myDataGridView.DataSource = myStringList; 但是只得到一个名为 ...

  5. NoSql相关

    1  NoSQL, No Problem: An Intro to NoSQL Databases https://www.thoughtworks.com/insights/blog/nosql-n ...

  6. pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)

    //2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...

  7. Kafka--Kafka简述

    Kafka的诞生 Kafka最初是LinkedIn的一个内部基础设施系统.我们发现,虽然有很多数据库和系统可以用来存储数据,但在我们的架构里,刚好缺一个可以帮助处理持续数据流的组件. 我们希望能够把数 ...

  8. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  9. react的this.setState详细介绍

    this.setState是react类组件中最常用的一个react API,使用它可以改变state从而改变页面.今天我们就来详细的学习一下这个东西.比如: import React, { Comp ...

  10. 四十、SAP中CASE语句用法

    一.上代码 二.选择内容 三.输出 四.我们选择一个其他的值 五.查看输出