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\n",dp[s][k]);

65     }

66     return 0;

67 }
View Code

 

你可能感兴趣的:(find)