题意

给定一棵 \(n\) 个节点的树,每条边有 \(\frac{1}{2}\) 的概率出现,这样会得出一个森林,求这个森林的邻接矩阵 \(A\) 的秩 \(\operatorname{rank} A\) 的期望。

\(\texttt{Data Range:}1\leq n\leq 5\times 10^5\)

题解

好题,正解是线性代数 + 期望 DP。其实是不知道结论感觉挺难只要知道结论就是 sb 题的题

首先来证明一个结论:一个森林邻接矩阵的秩为该森林最大匹配数目的两倍。

考虑 \(\operatorname{rank} A\) 的一个定义,也即非零子式的最高阶数。所以,设 \(\operatorname{rank}A=k\),我们只需要考虑一个 \(k\) 阶子式即可。很明显由于原图的邻接矩阵是对称矩阵,所以我们自然想去考虑一个对称的 \(k\) 阶子式,因为这个东西对应原图的一个导出子图。

同时,森林的导出子图还是森林,所以类似于二分,将最优化转化为判定,只要考虑一个森林的邻接矩阵什么情况下是满秩的即可。

注意到,对于 \(n\times n\) 的方阵 \(A\) 来说,\(\operatorname{rank} A=n\) 与 \(\det A\neq 0\) 等价。因为如果 \(\det A\neq 0\) 的话这个矩阵一定不是“压缩扁平化”的变换,也即 \(\dim \operatorname{Ker} A=0\),根据秩零化度定理即可得出。于是我们转为考察邻接矩阵的行列式,这里直接考虑定义:

\[\det A=\sum\limits_{\pi}\prod_{i=1}^{n}A_{i,\pi_i}
\]

注意到,\(A_{i,\pi_i}\) 非零,表示图上存在一条 \((i,\pi_i)\) 的边。所以 \(\det A\) 非零当且仅当存在一个排列 \(\pi\) 使得 \((i,\pi_i)\) 存在边。

将这个排列写成置换的形式,可以分解成若干个循环。注意到考察的对象是森林,所以所有循环的长度只可能是 \(2\),也即一条边产生一个循环。

这个时候,可以将每个循环内的点两两匹配,很明显的,由于每个点都被匹配上了,这个匹配是完美匹配。

于是我们推出一个结论:对于一个森林的邻接矩阵 \(A\) 来说,\(\operatorname{rank} A=n\) 与森林有完美匹配是等价的。所以 \(\operatorname{rank} A\) 也就是原图的最大满足有完美匹配的导出子图的大小。考虑求出原图的一个最大匹配,因为没有比最大匹配更大的匹配,所以我们可以选原图的最大匹配作为导出子图。

通过上述的说明,我们成功证明了 \(\operatorname{rank} A\) 为最大匹配数目的两倍。

这个时候就变成求最大匹配数目的期望了。根据期望的线性性,设 \(f_u\) 表示 \(u\) 与一个孩子匹配的概率,那么答案为所有 \(f_u\) 的和。同时这个 \(f_u\) 的转移非常简单,就不做过多说明了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=5e5+51,MOD=998244353,INV2=499122177;
struct Edge{
ll to,prev;
};
Edge ed[MAXN<<1];
ll n,tot,from,to,res,c;
ll last[MAXN],f[MAXN];
namespace FastIO{
char buf[MAXN*5],*st=buf,*ed=buf;
inline char gc()
{
return st==ed&&(ed=(st=buf)+fread(buf,1,2500000,stdin),ed==st)?0:*st++;
}
}
using FastIO::gc;
inline ll read()
{
register ll num=0;
register char ch=gc();
while(!isdigit(ch)&&ch!='-')
{
ch=gc();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=gc();
}
return num;
}
inline void addEdge(ll from,ll to)
{
ed[++tot].prev=last[from];
ed[tot].to=to;
last[from]=tot;
}
inline void dfs(ll node,ll fa)
{
ll prod=1;
for(register int i=last[node];i;i=ed[i].prev)
{
if(ed[i].to!=fa)
{
dfs(ed[i].to,node),prod=(li)prod*(1+f[ed[i].to])%MOD*INV2%MOD;
}
}
res=(res+(f[node]=MOD+1-prod))%MOD;
}
int main()
{
n=read(),c=1;
for(register int i=0;i<n-1;i++)
{
from=read(),to=read(),addEdge(from,to),addEdge(to,from),c=(c+c)%MOD;
}
dfs(1,0),printf("%d\n",(li)res*(c+c)%MOD);
}

CodeForces 1067E Random Forest Rank的更多相关文章

  1. Codeforces 1067E - Random Forest Rank(找性质+树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不知道能不能算上自己 AC 的 D1E(?) 挺有意思的结论题,结论倒是自己猜出来了,可根本不会证( 开始搬运题解 ing: 碰到这样 ...

  2. CF1067E Random Forest Rank

    CF1067E Random Forest Rank 可以证明: 一个树的邻接矩阵的秩,等于最大匹配数*2(虽然我只能证明下界是最大匹配) 而树的最大匹配可以贪心, 不妨用DP模拟这个过程 f[x][ ...

  3. [Machine Learning & Algorithm] 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  4. paper 85:机器统计学习方法——CART, Bagging, Random Forest, Boosting

    本文从统计学角度讲解了CART(Classification And Regression Tree), Bagging(bootstrap aggregation), Random Forest B ...

  5. paper 56 :机器学习中的算法:决策树模型组合之随机森林(Random Forest)

    周五的组会如约而至,讨论了一个比较感兴趣的话题,就是使用SVM和随机森林来训练图像,这样的目的就是 在图像特征之间建立内在的联系,这个model的训练,着实需要好好的研究一下,下面是我们需要准备的入门 ...

  6. 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)

    之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...

  7. Ensemble Learning 之 Bagging 与 Random Forest

    Bagging 全称是 Boostrap Aggregation,是除 Boosting 之外另一种集成学习的方式,之前在已经介绍过关与 Ensemble Learning 的内容与评价标准,其中“多 ...

  8. Aggregation(1):Blending、Bagging、Random Forest

    假设我们有很多机器学习算法(可以是前面学过的任何一个),我们能不能同时使用它们来提高算法的性能?也即:三个臭皮匠赛过诸葛亮. 有这么几种aggregation的方式: 一些性能不太好的机器学习算法(弱 ...

  9. codeforces 478B Random Teams

    codeforces   478B  Random Teams  解题报告 题目链接:cm.hust.edu.cn/vjudge/contest/view.action?cid=88890#probl ...

随机推荐

  1. (转载)Altium Designer 17 (AD17)

    转载自:http://blog.csdn.net/qq_29350001/article/details/52199356 以前是使用DXP2004来画图的,后来转行.想来已经有一年半的时间没有画过了 ...

  2. 网络端口及nmap扫描

    端口: 计算机与外界交流的出口,在渗透测试当中常用的端口号: 21号端口FTP:文件传输协议 23号端口Telent :远程登录接口 53号端口 DNS: 域名端口 80号端口HTTP:超文本传输协议 ...

  3. 虚拟机CentOS开机黑屏解决方案

    默认配置 错误: 1.直接就是黑屏,连杠杠都没有 2.centos系统关不掉 3.关闭vmware提示:虚拟机XXX繁忙 解决方案一: 1.以管理员身份运行cmd控制台程序 2.在cmd窗口中输入ne ...

  4. QTree1 【题解】

    题目背景 数据规模和spoj上有所不同 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时 ...

  5. ORA-00018: maximum number of sessions exceeded 超出最大会话数

    ORA-00018: maximum number of sessions exceededORA-00018: 超出最大会话数 Cause:       All session state obje ...

  6. bootStrap小结1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 正式班D9

    2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...

  8. C++字符串操作小结

    忽略大小写比较大小 库函数strcasecmp和_stricmp: 这两个函数都不属于C++标准库,strcasecmp由POSIX引入,windows平台则定义了功能等价的_stricmp.用法和C ...

  9. net core 微服务 快速开发框架

    dymDemo github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的 ...

  10. 16.深入k8s:Informer使用及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 由于这部分的代码是在client-go 中,所以使用的源码版本是client-go 1. ...