树形DP(HDU4616)

来源:互联网 发布:网页设计软件 编辑:程序博客网 时间:2024/05/18 02:25

一眼看上去就是树形DP。可是就是不知道为什么必须枚举每一条边,,,,而不能枚举每一个点!!!!

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<set>#include<map>#include<string>using namespace std;typedef long long ll;int w[100010],dp[100010][5];struct node{    int a,b,next;}edge[100010];int cnt,n,c,head[100010],op[100010];void add(int a,int b){    edge[cnt].a=a;    edge[cnt].b=b;    edge[cnt].next=head[a];    head[a]=cnt++;}int ans;int dfs(int u,int num){    if(num==c)return 0;    if(dp[u][num]!=-1)        return dp[u][num];    int fa=edge[u].a;    int v=edge[u].b;    int res=w[v];    for(int i=head[v];i!=-1;i=edge[i].next)    {        node e=edge[i];        if(e.b!=fa)        {            res=max(dfs(i,num+op[v])+w[v],res);        }    }    return dp[u][num]=res;}int main(){    int t;scanf("%d",&t);    while(t--)    {        memset(dp,-1,sizeof(dp));ans=0;        cnt=0;memset(head,-1,sizeof(head));scanf("%d%d",&n,&c);        for(int i=0;i<n;i++)scanf("%d%d",&w[i],&op[i]);        for(int i=1;i<n;i++)        {            int a,b;            scanf("%d%d",&a,&b);            add(a,b);add(b,a);        }        for(int i=0;i<cnt;i++)        {            node e=edge[i];            ans=max(ans,dfs(i,op[e.a])+w[e.a]);        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击