一棵树每个节点有一个权值,保证父亲节点与孩子节点不能同时出现,求出现的节点最大权值。
HDU 1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520
图1 : 走到叶子节点4 , 回退 ;
此时 , dp[4][go] , dp[4][notgo] 已有最优解 。
图2 : u -> v , v计算完回退的时候, dp[v][go] , dp[v][notgo] 已有最优解 。
注意: 1 、以任意节点为根节点都可以,因为是一颗同构树。
2、father - > u - > v
防止出现 father - > u - > father
const int Max_N = 6008 ; #define go 0 #define notgo 1 vector<int> List[Max_N] ; int N ; int dp[Max_N][2] ; void dfs(int u , int father){ int i , v ; for(i = 0 ; i < List[u].size() ; i++){ v = List[u][i] ; if(v == father) continue ; dfs(v , u) ; dp[u][go] += dp[v][notgo] ; dp[u][notgo] += max(dp[v][go] , dp[v][notgo]) ; } } int main(){ int i , u , v ; while(cin>>N){ memset(dp , 0 , sizeof(dp)) ; for(i = 1 ; i <= N ; i++) List[i].clear() ; for(i = 1 ; i <= N ; i++) scanf("%d" ,&dp[i][go]) ; while(scanf("%d%d" ,&u ,&v)){ if(u == 0 && v ==0) break ; List[u].push_back(v) ; List[v].push_back(u) ; } dfs(1 , -1) ; printf("%d\n" , max(dp[1][go] , dp[1][notgo])) ; /* 以任意节点为根节点都可以,因为是一颗同构树 。 dfs(2 , -1) ; printf("%d\n" , max(dp[2][go] , dp[2][notgo])) ;*/ } return 0 ; }
http://acm.fzu.edu.cn/problem.php?pid=1615
(a , b , w) a,b 都去,则损失w 。求最大值。
const int Max_N = 10008 ; #define go 0 #define notgo 1 struct Edge{ int v ; int w ; Edge(){} Edge(int i , int j):v(i),w(j){} }; map<string ,int> name ; vector<Edge>List[Max_N] ; int dp[Max_N][2] ; int N ; void dfs(int u){ int i , v , w ; for(i = 0 ; i < List[u].size() ; i++){ v = List[u][i].v ; w = List[u][i].w ; dfs(v) ; dp[u][notgo] += max(dp[v][go] , dp[v][notgo]) ; dp[u][go] += max(dp[v][notgo] , dp[v][go] - w) ; } } int main(){ int i , w , u , v , root ; char str[12] , str2[12] ; while(scanf("%d" ,&N) != EOF){ name.clear() ; for(i = 1 ; i <= N ; i++) List[i].clear() ; for(i = 1 ; i <= N ; i++){ scanf("%s %d" ,str , &dp[i][go]) ; name[string(str)] = i ; dp[i][notgo] = 0 ; } for(i = 1 ; i < N ; i++){ scanf("%s%s%d" ,str ,str2 ,&w) ; u = name[string(str)] ; if(i == 1) root = u ; v = name[string(str2)] ; List[u].push_back(Edge(v , w)) ; } dfs(root) ; printf("%d\n" ,max(dp[root][go] , dp[root][notgo])) ; } return 0 ; }