首页 > 其他分享 >【题解】[HNOI2015] 落忆枫音

【题解】[HNOI2015] 落忆枫音

时间:2023-07-28 09:13:19浏览次数:47  
标签:方案 环上 limits 题解 枫音 落忆 prod 节点 dp

题目传送门

感觉这题挺有意思的,遂写。

题目大意

给出一个有向无环图,再给定两个点 \(s\) 和 \(t\),表示在点 \(s\) 和 \(t\) 间加上一条边。求这个图有多少种生成树。

题目分析

首先考虑不加边之前的情况,假设给定下面这个图:
image

根据树的定义,除根节点外的节点有且只有一个父亲节点,也就是说对于每一个节点,我们要指定一个唯一的父节点。比如上图的点 \(5\),它在生成树上的父节点可以是 \(2\) 或者 \(6\)。又因为每个节点取父节点的情况互不干扰且是个无环图,所以用乘法原理可得生成树的方案有 \(\prod\limits_{i=2}^n in[i]\)。\(in[i]\) 表示点 \(i\) 的入度,也就是有 \(in[i]\) 个父节点可能。

再考虑加上一条边后可能有环的情况。将上图添加一个由 \(6\) 到 \(2\) 的有向边。

image

此时,点 \(2\),\(4\),\(6\) 形成一个环。我们发现,即使现在点 \(in[2]=2\),但它的合法方案只有 \(1\),因为它的父节点不能为点 \(6\),否则会形成环,不符合树的定义。

所以最后的方案数就等于所有方案数减去成环的方案数,而要使一个可以成环的点集成环,它有且只有一种方案,即每个节点的父节点都是上一个环上的点。如上图,若 \(6\) 的父节点是 \(4\),\(4\) 的父节点是 \(2\),但 \(2\) 的父节点是 \(1\) 的话,这时候不会形成一个环。

令集合 \(S\) 包含所有在环内的点,得出最后的结论:\(ans=\prod\limits_{i=2}^n in[i]-\prod\limits_{i\notin S,i\neq1}in[i]\)

我们令 \(dp[i]\) 表示从 \(t\) 到 \(i\) 的含环数量,用拓扑排序维护转移。初始值 \(dp[t]=\prod\limits_{i=2}^n in[i]\),状态转移 \(dp[v]=\frac{dp[u]}{in[v]}\)(\(u\) 可达 \(v\))。可以这样理解这个状态转移,由于多了一条 \((s,t)\) 的边,所以所有从 \(t\) 到 \(s\) 的路径上的点必然处于一个这条路径加上 \((s,t)\) 所形成的环上,每次转移一次就相当于除上一个在环上的 \(in[i]\) 值,最后的 \(dp[s]\) 就是所有有环的方案数。

最后注意由于 \(s\) 到 \(t\) 多加了一条边,所以 \(in[t]\) 要加一。但拓扑排序时 \(in[t]\) 要减回来,否则不一定能遍历到它在环上。

总结

遇到在一个较简单的基础上增添一些性质的题,可以从简单的基础上出发,最后再减去不合法方案。

标签:方案,环上,limits,题解,枫音,落忆,prod,节点,dp
From: https://www.cnblogs.com/Arcka/p/17585132.html

相关文章

  • 【AI夏令营】NLP赛题解析与Baseline逐行精读
    【任务】1.深入研读baseline代码,仔细理解其每个部分,并记录详尽的学习笔记;2.主动挑战自己,对基线代码进行优化,力求改进代码的实际效果和性能;3.完成任务二,并查看个人成绩排行榜。【Baseline精读】本次主要是针对任务二(关键词提取,也会有部分任务一的内容)首先是库文件的导入:#......
  • AT_arc113_c 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述现在有一个字符串\(S\),每一次你可以选择一个\(i(1\lei\le|S|)\),如果\(S_i=S_{i+1}\neS_{i+2}\)。就可以将\(S_{i+2}\)设为\(S_i\)求最多能操作几次。思路本......
  • 重建 题解
    重建题目大意给定一张无向图,第\(i\)条边存在的概率为\(p_i\),求这个无向图是一颗树的概率。思路分析所求即为:\[\sum_{T}\Bigg(\prod_{e\inT}p_e\Bigg)\Bigg(\prod_{e\not\inT}(1-p_e)\Bigg)\]其中,\(T\)是一个边集,当\(T\)中的边均存在时且其他边均不存在时,原图构成一......
  • AT_abc182_d 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述从数轴的原点开始向正方向走。第一次向前走\(a_1\)步,第二次向前走\(a_1+a_2\),以此类推。求走过的最大位置。思路首先直接模拟时间复杂度\(O(n^2)\),看一下数据范围\((1\leN......
  • Lucky Array 题解
    LuckyArray题目大意维护一个序列,支持以下操作:区间加一个大于\(0\)的数。区间查询有多少个数位上只包含\(4\)或\(7\)的数。思路分析看起来很不可做,但考虑到题目给了一个特殊性质:保证所有数操作前后都不超过\(10^4\)。那么如果暴力进行区间加,最坏情况会加\(1......
  • P9017 [USACO23JAN] Lights Off G 题解
    Description给定正整数\(N\),和两个长为\(N\)的\(01\)序列\(a\)和\(b\)。定义一次操作为:将\(b\)序列中的一个值翻转(即\(0\)变成\(1\),\(1\)变成\(0\),下同)。对于\(b\)序列中每个值为\(1\)的位置,将\(a\)序列中对应位置的值翻转。将\(b\)序列向右循环移位......
  • CF938G Shortest Path Queries 题解
    目录题目链接题目分析为什么使用生成树建树对于异或贡献的分析code题目链接CF938G洛谷挂了只能交CF题目分析本题有以下几个关键点:为什么使用生成树建树首先根据\(WC2011\)我们发现可以使用\(dfs\)序来保存节点之间的关系但是我们发现本题目中存在加边删边操作不......
  • UVA10702 Travelling Salesman 题解
     UVA10702TravellingSalesman题解题面:有个旅行的商人,他每到一个的新城市,便卖掉所有东西再购买新东西,从而获得利润。从某城市A到某城市B有固定利润(B 到A 的利润可能不同)。已知城市可以重复到达,从S 点出发,经过T 个城市,有E个城市能作为终点,求最大的利润。先定义......
  • CF1053E-Euler Tour题解
    前言还是一道神仙题很难想题面luogu上copy的样例解释懒得翻,我觉得应该都看得懂样例吧。题面翻译现有一棵\(n\)个点的形态未知的树,给定其长度为\(2n-1\)的欧拉序的一部分请根据给出的残缺的欧拉序还原出一个完整的欧拉序或判断不存在这样的树输入中用非零数字表示欧拉......
  • P3704 [SDOI2017] 数字表格 题解
    一、题目描述:用$f_i$表示斐波那契数列的第$i$项,那么有:$f_0=0,f_1=1;f_n=f_{n-1}+f_{n-2},n\ge2$现在有一个$n$行$m$列的数字表格,第$i$行第$j$列的数字是$f_{\gcd(i,j)}$。求这个表格所有数的乘积。共有$T$组数据,答案对$10^9+7$取模。......