POJ - 3417 Network 【树上差分 + LCA + 思维】

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上面的点。

这个就像是 树状数组的在一个点加上一个值,在后边一个点减去一个值,结果不影响区间之外的求和。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值