题目描述 Description
T64有一个好朋友,叫T128。T128是寄宿生,并且最近被老师叫过去当宿管了。宿管可不是一件很好做的工作,碰巧T128有一个工作上的问题想请T64帮忙解决。
T128的寝室条件不是很好,所以没有很多钱来装修。礼间寝室仅由 n − 1 n-1 n−1条双向道路连接,而且任意两间寝室之间都可以互达。最近,T128被要求对一条路径上的所有寝室进行管理,这条路径不会重复经过某个点或某条边。但他不记得是哪条路径了。他只记得这条路径上有不少于 k k k个寝室。于是,他想请T64帮忙数一下,有多少条这样的路径满足条件。
嗯…还有一个问题。由于最近有一些熊孩子不准晚上讲话很不爽,他们决定修筑一条“情报通道”,如果通道建成,寝室就变成了一个 n n n个点 n n n条边的无向图。并且,经过“情报通道”的路径也是合法的。T128心想:通道建成之前,T64还有一个高效的算法帮我数路径条数,但是通道建成之后,他还有办法吗?对,T64手忙脚乱,根本数不清有多少条路径。于是他找到了你。
输入 Input
第一行为三个正整数 n n n, m m m, k k k( 2 ≤ k ≤ n 2\le k\le n 2≤k≤n),代表有 n n n间寝室, m m m条边连接它们( n − 1 ≤ m ≤ n n-1\le m\le n n−1≤m≤n; m = n − 1 m=n-1 m=n−1意味着“情报通道”未被修好; m = n m=n m=n意味着“情报通道”已被修好),以及题目描述中的 k k k。
接下来 m m m行,每行两个正整数 x , y x,y x,y,代表第 x x x间寝室与第 y y y间寝室之间有一条双向边。
输出 Output
仅包含一个整数,代表经过至少 k k k间寝室的路径条数。
样例输入 Sample Input
5 5 2
1 3
2 4
3 5
4 1
5 2
样例输出 Sample Output
20
提示 Hint
限制 Limits
n ≤ 1 0 5 , k ≤ n n\le 10^5,k\le n n≤105,k≤n, m m m的要求如输入
Time Limit : 4s & Memory Limit : 512MB
给出了一个基环外向树,如何点分治?
把环干掉就是普通点分治了,所以先把环干掉再考虑环对子树的影响,去环这个过程可以并查集实现。
先普通点分治一遍,对于树的情况,直接输出,下面考虑环的情况。
从断点开始,扫一遍环上的外向树,只有这棵树里的点经断掉的边到其他外向树上的点才能计入答案,因为其他的情况在普通点分治里已经统计过了。这个可以用树状数组维护。
统计的是这棵外向树上的基点(就是在环上的点)到断点一端的距离和其余外向树到断点另一端的距离和大于等于
k
−
1
k-1
k−1的情况数。
树状数组的维护可以很奇妙……
不要忘了开long long……
向因为被我霍霍坏了退役四天的TP默哀一秒……
Code