首先理解题意后可以转化为
以S为根的树,用最少的权值去删除边,使得所有的叶子与S不相连。
如果可以得出上面的题意那这题就是个树dp简单题了。那么设
f[i] 为以i为根的子树,他的所有叶子都达不到i节点的最少权值花费。
显然方程就是f[i] = sum( min ( f [to], i与to相连的权) )
这个方程就是对于i的每一个儿子,你有两种选择,第一种是砍掉i与to相连的边,这样所有叶子都不会到达i,一种的利用f[to]算好的答案,取一个最小值
答案就是f[S]
int n, m, k,f[max_],du[max_];
vector<pair<int, int> >xian[max_];
void dfs(int now, int fa) {
if (du[now] == 1 && now != k) {
f[now] = INF; return;
}
for (auto pa : xian[now]) {
int to = pa.first, val = pa.second;
if (to == fa)continue;
dfs(to, now);
f[now] += min(f[to], val);
}
}
signed main() {
n = read(), m = read(), k = read();
for (int i = 1; i < n; i++) {
int a = read(), b = read(), c = read();
xian[a].push_back(make_pair(b, c));
xian[b].push_back(make_pair(a, c));
du[b]++; du[a]++;
}
dfs(k, 0);
write(f[k]);
return 0;
}