poj

周末牛客挂了个更难的,这个简单一些

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define maxn 200100
using namespace std;
typedef long long  ll;
struct Node {
	int p;
	int len;
	Node(int a, int b) :p(a), len(b) {}
};
vector<Node>G[maxn];
void insert(int be, int en, int len) {
	G[be].push_back(Node(en, len));
}
int t;
ll list[maxn];
int de[maxn];
int dfs(int x, int fa) {
	for (int i = 0; i < G[x].size(); i++) {
		int p = G[x][i].p;
		ll ln = G[x][i].len;
		if (p == fa) continue;
		dfs(p, x);
		if (de[p] == 1) list[x] += ln;
		else list[x] += min(ln, list[p]);
	}
	return 0;
}
ll f[maxn];
int dfs1(int x, int fa) {

	for (int i = 0; i < G[x].size(); i++) {
		int p = G[x][i].p;
		ll ln = G[x][i].len;
		if (p == fa) continue;
		if (de[x] == 1) f[p] = list[p] + ln;
		else f[p] = list[p] + min(ln, f[x] - min(ln, list[p]));

		dfs1(p, x);
	}
	return 0;
}
int main() {
	int n;
	scanf("%d", &t);
	while (t--) {
		int be, en;
		scanf("%d", &n);
		memset(list, 0, sizeof(list));
		memset(de, 0, sizeof(de));
		memset(f, 0, sizeof(f));
		for (int i = 0; i <= n; i++) G[i].clear();
		int len;
		for (int i = 1; i < n; i++) {
			scanf("%d %d %d", &be, &en, &len);
			insert(be, en, len);
			insert(en, be, len);
			de[be]++;
			de[en]++;
		}
		dfs(2, -1);
		f[2] = list[2];
		dfs1(2, -1);
		ll ans = 0;
		for (int i = 1; i <= n; i++) {
			ans = max(ans, f[i]);
		}
		printf("%d
", ans);
	}
	return 0;
}

  

寻找真正的热爱
原文地址:https://www.cnblogs.com/lesning/p/11765087.html