You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

##P3349 [ZJOI2016]小星星

一、题目描述

小 Y 是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有 n 颗小星星,用 m 条彩色的细线串了起来,每条细线连着两颗小星星。

有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了 n-1 条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。小 Y 找到了这个饰品的设计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,那么要求对应的小星星原来的图纸上也有细线相连。小 Y 想知道有多少种可能的对应方式。

只有你告诉了她正确的答案,她才会把小饰品做为礼物送给你呢。

输入格式

第一行包含 2 个正整数 n,m,表示原来的饰品中小星星的个数和细线的条数。

接下来 m 行,每行包含 2 个正整数 u,v,表示原来的饰品中小星星 uv 通过细线连了起来。这里的小星星从 1 开始标号。保证 u\neq v,且每对小星星之间最多只有一条细线相连。

接下来 n-1 行,每行包含 2 个正整数 u,v,表示现在的饰品中小星星 uv 通过细线连了起来。保证这些小星星通过细线可以串在一起。

输出格式

输出共 1 行,包含一个整数表示可能的对应方式的数量。

如果不存在可行的对应方式则输出 0

样例 #1

样例输入 #1

4 3
1 2
1 3
1 4
4 1
4 2
4 3

样例输出 #1

6

提示

对于 100\% 的数据,n\leq 17m\leq \frac 12n(n-1)

二、解题思路

树形计数类DP+容斥

老套路f[x][u]表示x子树中,x映射到原图中u这个点的方案数。

转移也很像,

f[x][u]=\prod_{y\in x}\sum_{v\in u} f[y][u]*ma[u][v]

当前点集,总方案为\displaystyle \sum_{i=1}^{n} f[root][i],即root映射到任意点的方案数之和。

意思是x对应u点,y对应v点,如果uv相连,那么这一部分可以算为一种方案。 容易发现状态是重复计算了的,所以要容斥一下。枚举点集的所有状态,记录点集大小,如果与n的差为偶则加,为奇则减。

这题很卡常,如果T了一定要参考代码实现。主要是要省掉统计点集大小这一步,建议用dfs来枚举所有状态。

https://www.cnblogs.com/bztMinamoto/p/9979627.html