传送门:牛客
题目描述:
Rinne 最近了解了如何快速维护可支持插入边删除边的图,并且高效的回答一下奇妙的询问。
她现在拿到了一个 n 个节点 m 条边的无向连通图,每条边有一个边权 wi
现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 S 之外度为 1 的点都不能到达 S。
定义删除一条边的代价为这条边的边权,现在 Rinne 想知道完成这个游戏的最小的代价,这样她就能轻松到达 rk1 了!作为回报,她会让你的排名上升一定的数量。
输入:
4 3 1
1 2 1
1 3 1
1 4 1
输出:
1
一道简单经典的树形dp的题目.
主要思路:
- 首先这道题有一个很重要的信息在备注里,那里描述了m=n−1m=n-1m=n−1,而作为一个联通图加上这个性质,那么这个联通图将变成一颗树!!,然后我们就可以使用树上的算法了
- 首先先使用一个dp[u]dp[u]dp[u]数组来存储uuu节点与所有其子树中的叶子节点断开的最小代价.然后我们不难想到这样的一个转移的想法: 那就是当前结点要是想要与自己的所有叶子节点断开关系的话,要么与当前的儿子断开关系,断开当前的儿子(也就是叶子节点的父亲),显然就是直接断开了所有的叶子节点了,或者不选择断开儿子,选择断开所有的叶子节点,然后从这两种情况下选择一种花费比较少的就行.
dp[u]=min(dp[v],dfs(v))dp[u]=min(dp[v],dfs(v))dp[u]=min(dp[v],dfs(v))
下面是具体的代码部分:
#include
#include
#include
#include
#include
#include