树形DP hdu1520

本文介绍了一个基于图遍历和动态规划算法的问题解决方法。通过定义结构体存储边信息,使用递归深度优先搜索(DFS)算法进行图遍历,并结合动态规划优化决策过程。该方法应用于寻找树形结构中特定节点的最大权值路径。
 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int fro,to,next;
 9 }e[36000000];
10 int dp[6000][2];
11 int num=0;
12 int head[6000];
13 int val[6000];
14 bool isye[6000];
15 
16 void addEdge(int _fro,int _to)
17 {
18     num++;
19     e[num].fro=_fro;
20     e[num].to=_to;
21     e[num].next=head[_fro];
22     head[_fro]=num;
23 }
24 
25 int dfs(int x)
26 {
27     dp[x][0]=0;
28     dp[x][1]=val[x];
29     for(int i=head[x];i!=-1;i=e[i].next)
30     {
31         int v=e[i].to;
32         dfs(v);
33         dp[x][0]+=max(dp[v][0],dp[v][1]);
34         dp[x][1]+=dp[v][0];
35     }
36     return max(dp[x][0],dp[x][1]);
37 }
38 
39 int main()
40 {
41     int n;
42     while(scanf("%d",&n)!=EOF)
43     {
44         for(int i=1;i<=n;i++)
45         {
46             scanf("%d",&val[i]);
47         }
48         int a,b;
49         for(int i=0;i<=n;i++)
50         {
51             head[i]=-1;
52             isye[i]=true;
53         }
54         while(scanf("%d%d",&a,&b)!=EOF)
55         {
56             if(a==0&&b==0)
57                 break;
58             addEdge(b,a);
59             isye[a]=false;
60         }
61         for(int i=1;i<=n;i++)
62         {
63             if(isye[i])
64             {
65                 cout<<dfs(i)<<endl;
66             }
67         }
68     }
69     return 0;
70 }
View Code

 

转载于:https://www.cnblogs.com/wsruning/p/4768413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值