POJ2631
树形dp可以边权不限(正负都可)
题意:给定一个树图,求最远点队(边权重和最大)
对于一个点而言,穿过它的最长路径是它的最长边与次长边之和。
int h[maxn], e[maxn], w[maxn], ne[maxn], idx;
int ans;
int n;
void add(int a, int b, int c) {
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u, int father) {
int dist = 0;//当前点向下走的最大长度
int d1 = 0, d2 = 0;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == father)continue;
int d = dfs(j, u) + w[i];
dist = max(dist, d);
if (d >= d1) {
d2 = d1; d1 = d;
}
else if (d > d2) d2 = d;
}
ans = max(ans, d1 + d2);
return dist;
}
int main()
{
int u, v, w;
memset(h, -1, sizeof(h));
while (scanf("%d%d%d", &u, &v, &w) != EOF) {
add(u, v, w);
add(v, u, w);
}
dfs(1, -1);
printf("%d\n", ans);
return 0;
}