思维啊 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 }