记录编号 350554 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 树和机器人 最终得分 100
用户昵称 Gravatarcoolkid 是否通过 通过
代码语言 C++ 运行时间 0.326 s
提交时间 2016-11-15 20:18:21 内存使用 7.37 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define C(x) cout<<#x<<":"<<x<<endl
  6. using namespace std;
  7.  
  8. const int MAXN=50000+20;
  9. int n,k,r;
  10.  
  11. struct Edge{
  12. int to,dist,nxt;
  13. Edge(int t=0,int d=0,int n=0){
  14. to=t;dist=d;nxt=n;
  15. }
  16. }edges[MAXN<<1];
  17. int head[MAXN],cnt=0;
  18. int dp[MAXN][30];
  19.  
  20. void addedge(int f,int t,int d){
  21. edges[cnt]=Edge(t,d,head[f]);head[f]=cnt++;
  22. edges[cnt]=Edge(f,d,head[t]);head[t]=cnt++;
  23. }
  24.  
  25.  
  26.  
  27. void init(){
  28. memset(head,-1,sizeof(head));
  29. scanf("%d%d%d",&n,&r,&k);
  30. for(int i=1;i<n;i++){
  31. int x,y,z;
  32. scanf("%d%d%d",&x,&y,&z);
  33. addedge(x,y,z);
  34. }
  35. }
  36.  
  37. void dfs(int u,int fa){
  38. for(int i=head[u];~i;i=edges[i].nxt){
  39. int v=edges[i].to;
  40. if(v!=fa){
  41. dfs(v,u);
  42. for(int j=k;j>=0;j--){
  43. dp[u][j]+=dp[v][0]+edges[i].dist*2;
  44. for(int l=1;l<=j;l++) dp[u][j]=min(dp[u][j],dp[v][l]+dp[u][j-l]+edges[i].dist*l);
  45. }
  46. }
  47. }
  48. }
  49.  
  50. int main(){
  51. freopen("trobot.in","r",stdin);
  52. freopen("trobot.out","w",stdout);
  53. init();
  54. dfs(r,0);
  55. printf("%d\n",dp[r][k]);
  56. return 0;
  57. }