LA 4015 树形DP 在路程不超过k的情况下,求最多可到达多少节点

来源:互联网 发布:太原新医医院网络平台 编辑:程序博客网 时间:2024/04/30 15:53
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{int to,next,val;}e[1000];int head[1000],cnt,n,vis[1000],num[1000];int dp[560][560][2];void add_edge(int from,int to,int val){e[cnt].to=to;e[cnt].val=val;e[cnt].next=head[from];head[from]=cnt++;}void dfs(int u){vis[u]=num[u]=1;dp[u][1][0]=dp[u][1][1]=0;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;int val=e[i].val;if(vis[to])continue;dfs(to);num[u]+=num[to];for(int j=num[u];j>1;j--)for(int k=1;k<=j&&k<=num[to];k++){dp[u][j][1]=min(dp[u][j][1],dp[u][j-k][1]+dp[to][k][1]+2*val);dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][1]+dp[to][k][0]+val);dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][0]+dp[to][k][1]+2*val);}}}int main(){int t=1;while(~scanf("%d",&n)&&n){memset(vis,0,sizeof(vis));memset(dp,0x3f,sizeof(dp));memset(head,-1,sizeof(head));cnt=0;     for(int i=1;i<n;i++)    {     int a,b,c;    scanf("%d%d%d",&a,&b,&c);    add_edge(b,a,c);    }    dfs(0);    printf("Case %d:\n",t++);    int q;    scanf("%d",&q);    while(q--)    {    int x;    scanf("%d",&x);    for(int i=n;i>=0;i--)    if(dp[0][i][0]<=x||dp[0][i][1]<=x)    {    printf("%d\n",i);    break;}}    }}

阅读全文
0 0
原创粉丝点击