[洛谷P3931]SAC E#1

题目大意:给你一棵带权有根树,可以切断一些边,问使得根和叶子节点不连通的最小代价。

题解:做了一天的网络流,这道题显然可以用最小割来做,但是也可以用树形$DP$,基本同[SDOI2011]消耗战,这道题一次询问,只需要那个$O(n)$的$DP$就行了。

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 100010
const long long inf = 0x3f3f3f3f3f3f3f3f;

int head[maxn], cnt;
struct Edge {
	int to, nxt, w;
} e[maxn << 1];
inline void addedge(int a, int b, int c) {
	e[++cnt] = (Edge) { b, head[a], c }; head[a] = cnt;
	e[++cnt] = (Edge) { a, head[b], c }; head[b] = cnt;
}

int n, rt, ind[maxn];

long long dfs(int u, int fa = 0) {
	long long res = 0;
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].to;
		if (v != fa) res += std::min(dfs(v, u), static_cast<long long> (e[i].w));
	}
	if (u != rt && ind[u] == 1) return inf;
	return res;
}

int main() {
	scanf("%d%d", &n, &rt);
	for (int i = 1, a, b, c; i < n; ++i) {
		scanf("%d%d%d", &a, &b, &c);
		addedge(a, b, c);
		++ind[a], ++ind[b];
	}
	printf("%lld
", dfs(rt));
	return 0;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/10342942.html