hdu4003Find Metal Mineral(树形DP)

4003

思维啊 dp[i][j]表示当前I节点停留了j个机器人 那么它与父亲的关系就有了 那条边就走了j遍

 dp[i][j] = min(dp[i][j],dp[child][g]+dp[i][j-g]+g*w[i][child] );

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 using namespace std;
10 #define N 10010
11 #define LL __int64
12 struct node
13 {
14     int u,v,w,next;
15 }ed[N<<1];
16 int head[N],t,k;
17 int dp[N][20];
18 void init()
19 {
20     t = 0;
21     memset(head,-1,sizeof(head));
22 }
23 void add(int u,int v,int w)
24 {
25     ed[t].u = u;
26     ed[t].v = v;
27     ed[t].w = w;
28     ed[t].next = head[u];
29     head[u] = t++;
30 }
31 void dfs(int pre,int u)
32 {
33     int i,j;
34     for(i = head[u] ; i!=-1 ; i = ed[i].next)
35     {
36         int v = ed[i].v;
37         if(v==pre) continue;
38         dfs(u,v);
39         for(j = k ; j >= 0 ; j --)
40         {
41             dp[u][j]+=dp[v][0]+2*ed[i].w;
42             for(int g = 1 ; g <= j ; g++)
43             {
44                 dp[u][j] = min(dp[u][j],dp[u][j-g]+dp[v][g]+g*ed[i].w);
45             }
46         }
47     }
48 }
49 int main()
50 {
51     int i,n,s;
52     while(scanf("%d%d%d",&n,&s,&k)!=EOF)
53     {
54         memset(dp,0,sizeof(dp));
55         init();
56         for(i = 1 ; i < n ; i++)
57         {
58             int u,v,w;
59             scanf("%d%d%d",&u,&v,&w);
60             add(u,v,w);
61             add(v,u,w);
62         }
63         dfs(-1,s);
64         printf("%d
",dp[s][k]);
65     }
66     return 0;
67 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3414054.html