题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=143
题意:
给定n个点
下面每个点权值(下标从1开始)
无向树
问一个联通块的最大权值是多少(必须有点)
#include<stdio.h>
#include<string.h>
inline int Max(int a,int b){return a>b?a:b;}
#define N 16010
struct Edge{
int from, to, nex;
}edge[N<<1];
int head[N], edgenum;
void addedge(int u, int v){
Edge E = {u, v, head[u]};
edge[ edgenum ] = E;
head[u] = edgenum++;
}
int dp[N], ans, n;
void dfs(int u, int fa){
for(int i = head[u]; ~i; i =edge[i].nex){
int v = edge[i].to;
if(v == fa)continue;
dfs(v, u);
if(dp[v] > 0)dp[u] += dp[v];
}
ans = Max(ans, dp[u]);
}
int main(){
memset(head, -1, sizeof(head)); edgenum = 0;
ans