https://vjudge.net/problem/POJ-3417
题意:
先给一棵具有n个节点的树, 然后再给出m条边, 问从树上删去一条边, 再从m条边中删去一条边, 把这个图分成至少两部分的方案数.
思路:
很容易就可以想到,每加入一条边,都会形成环。这条环是什么样的呢? 肯定是, u -> lca(u,v) -> v - > u 肯定是这样一个环,我们可以把这条环上的路径的权值加一。路径仅限是原来 的树上的路径。当我们吧每个新加的边都弄完之后,
如果原来的树上的边的权值是 0 ,说明他很脆弱,把这条边去掉,就一定会形成两部分,所以另一条边就随便去掉, 有 m 中可能。
如果原来的树上的边的权值是 1 ,说明把这个边去掉,还要去掉一个特定的另外一条边,所以 只有一种可能。
如果边的权值大于1, 那在怎么去掉也不可能变成两部分。
所以最后我们只要统计边的权值就好了,在想一下,边的权值并不好加,我们我们选择让边的权值下降到他的下面节点上。
第一个点没有用。把下面的点的权值加1,把lca的那点 -2. d[u]++, d[v]++ d[lca[u,v]] -= 2.
我们最后再树上跑dp,每个点的权值就是他的儿子的权值和。因为我们在lca - 2 了,所以不会影响到lca上面的点。
这个就像是 树状数组的在一个点加上一个值,在后边一个点减去一个值,结果不影响区间之外的求和。