P4582 [FJOI2014] 树的重心

news/2025/2/9 11:53:59/文章来源:https://www.cnblogs.com/Pengzt/p/18705926

树的重心

题目链接。cnblogs。luogu。

Problem

\(T\)\(T \le 50\))组测试数据。

每次给出 \(n\)\(\le 200\))个节点的树,求它的连通子图数量,使得它的重心与整棵树的重心重合。答案对质数 \(P\) 取模。

Sol

不妨设 \(d_i\) 表示以 \(u\) 为根的时候,\(i\) 的子树大小。

先找到树的重心。发现只有 \(\max d_i = n / 2\) 的时候才会出现两个重心。

  • 只有一个重心:

不妨记这个重心为 \(rt\)

\(f_{u, i}\) 表示 \(u\) 子树中,连通子图大小为 \(i\) 的数量。

有转移:\(f'_{u, i} = \sum\limits_{j = 0}^{sz_v} f_{u, i - j}\cdot f_{v, j}\)。然后 \(f\gets f'\)

\(u\) 做完之后 \(f_{u, i}\gets f'_{u, i - 1}\)。最后 \(\forall u \ne rt, f_{u, 0} = 1\)。然后初始的时候 \(\forall u\in \text{leaf}, f_{u, 1} = 1\)。这里由于第二维是 \(\mathcal{O}(sz_v)\) 的,所以这部分的时间复杂度为 \(\mathcal{O}(n^2)\)

\(u\) 为根的时候,记连通块大小为 \(sz\),那么要统计 \(\max d_i < sz/2\) 的答案,这个东西其实不是很好统计,但是发现 \(\ge sz / 2\) 的儿子很少,考虑统计 \(\max d_i > (sz - 1) / 2\) 的数量。令 \(g_{v, i}\) 表示不考虑 \(v\) 这个儿子和 \(u\),连通块大小为 \(i\) 的方案数。则答案为 \(\sum \limits_{i = 1}^{sz_v} f_{v, i} \cdot \sum \limits_{j = 0}^{i - 1} g_{v, j}\)。然后就是求出 \(g_{u, i}\)。不难发现 \(g\) 可以表示为一个前缀和后缀的并,这个前后缀的预处理是可以 \(\mathcal{O}(n\cdot\sum sz_v) = \mathcal{O}(n^2)\) 的。直接暴力合并出 \(g\) 的话是 \(\mathcal{O}(n^3 / n^2\log)\) 的,但是发现 \(g\) 只有前 \(sz_v\) 项有用,所以合并就变为 \(\mathcal{O}(\sum sz_v^2) = \mathcal{O}(n^2)\) 的了。

  • 两个重心:

\((rt_1, rt_2)\) 断开,然后分别以 \(rt_1\)\(rt_2\) 为根跑一遍。然后答案为 \(\sum f_{rt_1, i}\cdot f_{rt_2, i}\)

时间复杂度 \(\mathcal{O}(n^2)\)

具体实现可以参考代码,感觉已经很清楚了。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
mt19937_64 eng(time(0) ^ clock());
template <typename T>
T rnd(T l, T r) { return eng() % (r - l + 1) + l; }
const int P = 10007;
int n, rt1, rt2;
vector<int> e[205];
int sz[205], mx[205];
void DFS(int u, int ff) {sz[u] = 1;for (int v : e[u])if (v != ff) {DFS(v, u);sz[u] += sz[v];mx[u] = max(mx[u], sz[v]);}mx[u] = max(mx[u], n - sz[u]);if (!rt1 || mx[u] < mx[rt1])rt1 = u, rt2 = 0;else if (mx[u] == mx[rt1])rt2 = u;
}
int f[205][205], g[205][205], pre[205][205], suf[205][205], temp[205];
void Work(int u, int ff) {sz[u] = 1;int son = 0;f[u][0] = 1;for (int v : e[u])if (v != ff) {++son;Work(v, u);memset(temp, 0, sizeof (temp));sz[u] += sz[v];for (int i = 0; i <= sz[u]; i++)for (int j = 0; j <= min(sz[v], i); j++)(temp[i] += f[u][i - j] * f[v][j]) %= P;memcpy(f[u], temp, sizeof (f[u]));}for (int i = sz[u]; i; --i) f[u][i] = f[u][i - 1];f[u][0] = 1;if (!son) f[u][1] = 1;
}
int ans;
void Solve(int test) {memset(f, 0, sizeof (f)), memset(g, 0, sizeof (g)), memset(pre, 0, sizeof (pre)), memset(suf, 0, sizeof (suf)), memset(mx, 0, sizeof (mx));rt1 = rt2 = 0;scanf("%d", &n);for (int i = 1, u, v; i < n; i++)scanf("%d%d", &u, &v), e[u].emplace_back(v), e[v].emplace_back(u);DFS(1, 0);if (rt2) {Work(rt1, rt2);Work(rt2, rt1);ans = 0;for (int i = 1; i <= n / 2; i++)(ans += f[rt1][i] * f[rt2][i]) %= P;printf("Case %d: %d\n", test, ans);for (int i = 1; i <= n; i++) e[i].clear();return;}ans = 1;Work(rt1, 0);for (int i : e[rt1]) {int s = 0;for (int j = 0; j <= n; j++)(s += f[i][j]) %= P;(ans *= s) %= P;}pre[0][0] = 1;int len = (int)e[rt1].size();for (int i = 0; i < len; i++) {int v = e[rt1][i];for (int j = 0; j <= n; j++)for (int k = 0; k <= min(sz[v], j); k++)(pre[i + 1][j] += pre[i][j - k] * f[v][k]) %= P;}suf[len + 1][0] = 1;for (int i = len - 1; i >= 0; --i) {int v = e[rt1][i];for (int j = 0; j <= n; j++)for (int k = 0; k <= min(sz[v], j); k++)(suf[i + 1][j] += suf[i + 2][j - k] * f[v][k]) %= P;}for (int i = 1; i <= len; i++) {int v = e[rt1][i - 1];for (int j = 0; j <= sz[v]; j++)for (int k = 0; k <= j; k++)(g[i][j] += pre[i - 1][j - k] * suf[i + 1][k]) %= P;for (int j = 1; j <= sz[v]; j++)(g[i][j] += g[i][j - 1]) %= P;for (int j = 1; j <= sz[v]; j++)(ans -= f[v][j] * g[i][j - 1]) %= P;}(ans += P) %= P;printf("Case %d: %d\n", test, ans);for (int i = 1; i <= n; i++) e[i].clear();
}
int main() {int T;scanf("%d", &T);for (int i = 1; i <= T; i++)Solve(i);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881179.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

htb Precious walkthrough

找到exp https://github.com/UNICORDev/exploit-CVE-2022-25765/blob/main/exploit-CVE-2022-25765.py 这个exp是有问题的 直接执行exp是没反应把他的payload cp出来手动粘贴到 框框里 然后就反弹shell成功flag在另一个用户里面 进过一番查找 在家目录的.bundle里的文件发现了…

Element简单组件开发

Element简单组件开发 1.项目创建 需要的环境:webStorm,NodeJS 创建一个工程化的Vue项目,在创建工程的文件夹中打开CMD命令窗口,执行命令:npm create vue@3.3.4 (3.3.4是我们安装Vue的版本)详细步骤说明: - Project name:------------------》项目名称,默认值:vue-proj…

⑨也能看懂的 nginx 与 C++ 简易版集成

原理概述 nginx 运行在端口A,转发数据给端口B,C++ 监听端口B的数据。 本文例子 使用 C++ 和 nginx 获取客户端的IP地址 代码 nginx 配置 #user nobody; worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/…

探秘Transformer系列之(1):注意力机制

探秘Transformer系列之(1):注意力机制 0x00 概述 因为各种事情,好久没有写博客了,之前写得一些草稿也没有时间整理(都没有时间登录博客和微信,导致最近才发现好多未读消息和私信,在这里和各位朋友说下万分抱歉)。现在恢复更新,是因为最近有些从非AI领域转过来的新同学…

Windows的MySQL数据库升级(解压包方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…

【数据库架构】基于自主可控数据库实现两地三中心容灾的探索与实践

【摘要】金融行业作为第二批次信创试点单位,在大力推广国产软件的背景下,如何保障业务连续性、满足监管部门RPT及RTO指标是新形势下的重要技术挑战,本文作者结合所在单位案例实践,阐述基于OceanBase分布式数据库实现两地三中心容灾的解决方案,供同行参考。 【作者】陈明福…

小包搜题考试

安规考试懒人专用 一、在应用软件商店搜索小包搜题二、微信中找到题库,在微信中点击打开,点击右上角三个点,选择用其他应用打开三、选择小包搜题,进入之后会自动导入题库并给题库命名(随意起),导入成功之后退出小包搜题四、重新进入小包搜题,点击右上角的录屏搜题五、弹…

Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统

一、前言说明 监控系统中一般有很多设备,有些用户希望知道每个设备是否已经上线,最好有不同的状态图标提示,海康的做法是对设备节点的图标和颜色变暗处理,离线的话就变暗,有可能是加了透明度,而大华的处理是有个清晰的图标表示,上线图标右下角有个绿色指示灯,离线的右下…

VIP视频解析之小工具(免费自取)

我们通常会因为看电影但是需要vip却没有足够生活费去支持的困扰 我就在想有没有白嫖的方法呢(bushi 就在我苦恼的时候我发现了一个方法————就是被称为:解析 的技术这玩意就是最好的选择 但是可能部分人在刚刚接触的时候不会用的于是我就写了一个小软件来支持(只支持wind…

2025年值得推荐的 8 款 WPF UI 控件库

前言 今天大姚给大家分享 8 款开源、美观、功能强大、简单易用的WPF UI控件库,希望可以帮助到有需要的同学。 WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能,让开发者可以…

github官网运行加速方法

github官网打不开的原因 访问github官网时是直接访问域名即github.com,中间有个域名通过DNS解析的过程,将域名解析为对应的ip地址,其实主要时间都是花在了DNS解析上,导致了github有时候能打开,有时候打不开,有时候访问很慢。 解决方案 1、Windows系统打开cmd,输入下列命…

关于AI生成艺术、自动驾驶汽车和Nutella片

Foto di Barbara Zandoval su Unsplash前言:当前时代人们似乎仍然坚信AI没有人类这样的创造力的!那人类的创造力又是什么呢?不也是从开始拥有认识能力,然后逐渐进化到现在空前的创造力的吗?如果AI也自我进化,创造力又能意味着什么? 我是个万事通。作为一名自由职业的在线…