发现给出了一棵树, 不是树的情况直接输出-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. PhoneGap简易配置使用

    在Android Studio 里新一下Android项目, 这个不用说了. 链接: https://pan.baidu.com/s/1qYcCBEW 密码: ymhh 添加 cordovaapp-c ...

  2. python使用opencv在Windows下调用摄像头

    环境准备 1.我这里使用的是python3.7.4,python官网下载较慢的同学可以移步至 https://pan.baidu.com/s/1XiPafBjM__zfBvvsLyK7kQ 提取码:z ...

  3. chrome警告:Synchronous XMLHttpRequest on the main thread

    警告 原因 ajax同步请求会触发此警告 分析 这段英文翻译:主线程上的同步XMLHttpRequest不受欢迎,因为它对最终用户的体验有害: ajax同步,在向后台请求的过程中,前台代码执行会停留在 ...

  4. C# 控制台应用程序从外部传参运行和调试

    参考:/*十有三博客*/ 新建一个用于演示的控制台应用程序项目,然后在Program.cs的入口Main方法里编写如下代码 foreach (var arg in args) { Console.Wr ...

  5. 注解方式实例化Java类

    context:component-scan标签: Sprng容器通过context:component-scan标签扫描其base-package标签属性值指定的包及其子包内的所有的类并实例化被@C ...

  6. 安卓多个按钮使用一个OnClickListener

    安卓studio 3.1 版本编译通过 一个按钮id为bt1 一个按钮Id为bt2 mainactivity 代码入下 package com.example.vmpdump.firstapp; im ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-forward

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. Java Break 与 Continue

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  9. 【转帖】影响超 10 亿设备,博通和 Cypress 芯片曝惊天漏洞,苹果、华为、三星等中招

    影响超 10 亿设备,博通和 Cypress 芯片曝惊天漏洞,苹果.华为.三星等中招   https://www.infoq.cn/article/lpNEQGrxZL22gHDPBE2z   26 ...

  10. 【php】PHP现代框架代表-Laravel框架核心技术特性

    一.php语言特点及发展现状 1.服务端脚本语言,自由度太大 ,一个业务逻辑可言写在模型里,控制器里,也可以单独封装成一个类,甚至可以嵌入到html里,这样势必会造成混乱,业务逻辑散落在各处,尤其对于 ...