【JZOJ A组】树

Description

我们有一颗从1到n编号的n个结点的树,此外,您将从树中获得M个节点对,形式为(a1,b1),(a2,b2),…(am,bm).
我们需要给每一条边定向,使得每一对节点对存在一条从ai到bi或从bi到ai的路径。
现在要求方案数,对10^9+7取mod即可。

Input

第一行两个整数,n,m
接下来n-1行,每一行两个整数,描述一条树边。
接下来m行,描述ai,bi

Output

输出一个整数,表示方案数对10^9+7取mod

Sample Input

input1:
4 1
1 2
2 3
3 4
2 4
input2:
7 2
1 2
1 3
4 2
2 5
6 5
5 7
1 7
2 6
input3:
4 3
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output

output1:
4
output2:
8
output3:
0

Data Constraint

对于前20%的数据,保证是一条链。
另有40%的数据,n,m<=5000
对于100%的数据,n,m<=300000

思路

首先可以发现一点。
有一对(ai,bi)时,只要有其中一条边方向确定,其他边方向也确定了

我们不妨每一条边看做一个点,假如两条边有关系,那么就把它们并查集起来。
然后最后的答案就是 2 的并查集的个数次方。

需要注意的是,并查集连接的时候需要用深度较大的边向深度较小的连,这样子有一个好处就是,我们向上连边的时候可以一次性跳过之前已经在同一个集合的一段,就不会超时。

现在的关键就是判断答案为 0 的情况。

我们可能存在这样的情况,(a,b)(b,c)(a,c)分别方向相反,这样就矛盾了。

我们在并查集的时候还需要维护一个信息,就是在并查集树上,当前点和他的父亲节点方向相同还是相反,每一次连接之前做一个判断就可以知道是否有矛盾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值