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)分别方向相反,这样就矛盾了。
我们在并查集的时候还需要维护一个信息,就是在并查集树上,当前点和他的父亲节点方向相同还是相反,每一次连接之前做一个判断就可以知道是否有矛盾。