Codeforces 1067E - Random Forest Rank(找性质+树形 dp)
一道不知道能不能算上自己 AC 的 D1E(?)
挺有意思的结论题,结论倒是自己猜出来了,可根本不会证(
开始搬运题解 ing:
碰到这样的题我们肯定要考虑一个图邻接矩阵的秩是什么。显然根据我们幼儿园就学过的线性代数,对于一个矩阵 \(A\) 而言,其行列式就是其最大的子式满足其行列式不等于 \(0\),也就是任取若干行 & 若干列,它们的交组成的矩阵行列式不等于 \(0\),不难发现对于一个森林的邻接矩阵而言,对于任意一个子式,如果它的行列式不等于 \(0\),那么它的行、列下标的并组成的主子式的行列式肯定也非零,因此我们只用考虑其主子式就行了,而主子式显然可以看作导出子图的邻接矩阵,因此我们接下来只需探究什么样的矩阵行列式非零。
考虑行列式的展开式:
\]
显然对于后面的 \(\prod\) 而言,只有 \((i,p_i)\) 存在边相连时 \(A_{i,p_i}\) 才非零,而由于图无自环,如果 \(\exists i,s.t.i=p_i\) 必然有 \(p\) 对 \(\det A\) 的贡献为 \(0\),同理,如果 \(p\) 存在一个大小 \(\ge 3\) 的置换环,那么由于图是一个森林,不可能这些点之间两两相邻的点都存在边,对 \(\det A\) 的贡献也为 \(0\)。也就是说只有 \(p\) 中所有置换环大小都为二,也就是我们选出的是一个形如的 \((i,p_i)\) 的完美匹配,而由于图是一个森林,因此完美匹配个数肯定 \(\le 1\),具体构造方案就是从叶子开始贪心地匹配,如果匹配不了就不存在完美匹配,因此 \(\det A\) 非零的充要条件是图存在完美匹配,因此我们可以得到这样一个性质:
Observation. 对于图 \(G\) 而言,\(G\) 邻接矩阵的秩是 \(G\) 最大匹配的大小 \(\times 2\)。
有了这个性质之后就可以 DP 了。\(way_{i,0/1}\) 表示钦定以 \(i\) 为根的子树内的边,并且在最大匹配中 \(i\) 选/没选的方案数,\(dp_{i,0/i}\) 表示钦定以 \(i\) 为根的子树内的边,并且在最大匹配中 \(i\) 选/没选的所有方案中最大匹配个数的总和。转移就分 \((i,j)\) 的边选/不选,然后分类讨论一下即可,复杂度 \(\mathcal O(n)\)
const int MAXN=5e5;
const int MOD=998244353;
int n,hd[MAXN+5],to[MAXN*2+5],nxt[MAXN*2+5],ec=0;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int dp[MAXN+5][2],way[MAXN+5][2];
void dfs(int x,int f){
way[x][0]=1;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f) continue;dfs(y,x);
static int tmp_dp[2]={0},tmp_way[2]={0};
memset(tmp_dp,0,sizeof(tmp_dp));
memset(tmp_way,0,sizeof(tmp_way));
tmp_way[0]=(1ll*way[x][0]*(way[y][0]+way[y][1]))%MOD;
tmp_dp[0]=(1ll*dp[x][0]*(way[y][0]+way[y][1])+1ll*(dp[y][0]+dp[y][1])*way[x][0])%MOD;
tmp_way[1]=(1ll*way[x][1]*(way[y][0]+way[y][1])*2)%MOD;
tmp_dp[1]=2ll*(1ll*dp[x][1]*(way[y][0]+way[y][1])+1ll*(dp[y][0]+dp[y][1])*way[x][1])%MOD;
tmp_way[0]=(tmp_way[0]+1ll*way[x][0]*way[y][1])%MOD;
tmp_dp[0]=(tmp_dp[0]+1ll*dp[x][0]*way[y][1]+1ll*dp[y][1]*way[x][0])%MOD;
tmp_way[1]=(tmp_way[1]+1ll*way[x][0]*way[y][0])%MOD;
tmp_dp[1]=(tmp_dp[1]+1ll*dp[x][0]*way[y][0]+1ll*dp[y][0]*way[x][0]+1ll*way[x][0]*way[y][0])%MOD;
for(int i=0;i<2;i++) dp[x][i]=tmp_dp[i],way[x][i]=tmp_way[i];
}
// printf("%d %d %d %d %d\n",x,dp[x][0],dp[x][1],way[x][0],way[x][1]);
}
int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),adde(u,v),adde(v,u);
dfs(1,0);printf("%d\n",2ll*(dp[1][0]+dp[1][1])%MOD);
return 0;
}
Codeforces 1067E - Random Forest Rank(找性质+树形 dp)的更多相关文章
- CodeForces 1067E Random Forest Rank
题意 给定一棵 \(n\) 个节点的树,每条边有 \(\frac{1}{2}\) 的概率出现,这样会得出一个森林,求这个森林的邻接矩阵 \(A\) 的秩 \(\operatorname{rank} A ...
- Codeforces 348E 树的中心点的性质 / 树形DP / 点分治
题意及思路:http://ydc.blog.uoj.ac/blog/12 在求出树的直径的中心后,以它为根,对于除根以外的所有子树,求出子树中的最大深度,以及多个点的最大深度的lca,因为每个点的最长 ...
- CF1067E Random Forest Rank
CF1067E Random Forest Rank 可以证明: 一个树的邻接矩阵的秩,等于最大匹配数*2(虽然我只能证明下界是最大匹配) 而树的最大匹配可以贪心, 不妨用DP模拟这个过程 f[x][ ...
- Codeforces 1097G Vladislav and a Great Legend [树形DP,斯特林数]
洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- codeforces 816 E. Karen and Supermarket(树形dp)
题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...
- codeforces 161 D. Distance in Tree(树形dp)
题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...
- [CQOI2009]叶子的染色【性质+树形Dp】
Online Judge:Bzoj1304,Luogu P3155 Label:无根树,树形Dp 题目描述 给定一棵\(N\)个节点的无根树,它一共有\(K\)个叶子节点.你可以选择一个度数大于1的节 ...
- Codeforces 1606F - Tree Queries(虚树+树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 显然我们选择删除的点连同 \(u\) 会形成一个连通块,否则我们如果选择不删除不与 \(u\) 在同一连通块中的点,答案一定更优. 注意到 ...
随机推荐
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
- 【二食堂】Beta - Scrum Meeting 6
Scrum Meeting 6 例会时间:5.19 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 实体标注的优化基本已经实现,后端有bug,还没有进行接口调用 issue 2 ...
- DP接口中AUX
背景技术: DP接口(DisplayPort)是一种图像显示接口,它不仅可以支持全高清显示分辨率(1920×1080),还能支持4k分辨率(3840×2160),以及最新的8k分辨率(7680×432 ...
- stm32中的串口通信你了解多少
在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...
- Iptables 代理局域网内的主机上网
参考连接:https://developer.aliyun.com/article/607330 环境为云环境,有外网主机的IP为192.168.0.39,无外网主机的IP为192.168.0.228 ...
- AppScan 10安装使用
一.简介 AppScan是IBM的一款web安全扫描工具,具有利用爬虫技术进行网站安全渗透测试的能力,能够根据网站入口自动摸取网页链接进行安全扫描,提供了扫描.报告和修复建议等功能. appscan有 ...
- 『学了就忘』Linux基础命令 — 34、配置网络相关命令
目录 1.配置网络常用命令 2.ifconfig命令 3.ping命令 4.netstat 命令 使用1:查看本机开启的端口 使用2:查看本机有哪些程序开启的端口 使用3:查看所有连接 使用4:查看网 ...
- GitHub出现Permission denied (publickey)
Permission denied (publickey) 没有权限的publickey 重新生成一次ssh key即可解决 ssh-keygen -t rsa -C "这里输入你的邮箱&q ...
- Python | Python语法基础
目录 前言 1. 变量与简单数据结构 2. 列表相关 3. 集合 4. If语句 5. 字典 6. 用户输入和while循环 7. 函数 8. 类与对象 9. 文件 10. 异常 11. 测试 最后 ...
- python接口之request测试:以json格式发送post请求,.json方法,查看响应结果的情况
json和dict python中的dict类型要转换为json格式的数据需要用到json库: import json <json> = json.dumps(<dict>) ...