比赛 |
20161115 |
评测结果 |
AWWWTTAAWWWWTTTTTTTT |
题目名称 |
树和机器人 |
最终得分 |
15 |
用户昵称 |
Riolu |
运行时间 |
11.080 s |
代码语言 |
C++ |
内存使用 |
5.24 MiB |
提交时间 |
2016-11-15 11:45:56 |
显示代码纯文本
/*=========================================*
* Auther: Riolu
* Time: 2016.11.15
* ©Copyright 2016 Riolu. All Rights Reserved.
*=========================================*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
#define v first
#define w second
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int N= 5e4+1;
int n,k,r;
vector<P> tu[N];
vector<P> u[N];
bool vis[N];
void dfs(int rt){
int i,l=tu[rt].size();
vis[rt]=1;
for(i=0;i<l;i++)if(!vis[tu[rt][i].v]){
u[rt].push_back(tu[rt][i]);
dfs(tu[rt][i].v);
}
}
void load(){
freopen("trobot.in","r",stdin);
freopen("trobot.out","w",stdout);
int i,j,a,b,v;
scanf("%d%d%d",&n,&r,&k);
for(i=1;i<n;i++){
scanf("%d%d%d",&a,&b,&v);
tu[a].push_back(P(b,v));
tu[b].push_back(P(a,v));
}
}
int f2[N][21];
int dp(int rt,int num){
int l=u[rt].size(),i,j,ans=1e9,t;
if(!l)return 0;
int f[l+1][num+1];
memset(f,60,sizeof(f));
f[0][0]=dp(u[rt][0].v,0)+2*u[rt][0].w;
for(i=1;i<=num;i++)f[0][i]=dp(u[rt][0].v,i)+u[rt][0].w;
for(i=1;i<l;i++){
for(j=0;j<=num;j++){
for(t=0;t<j;t++){
if(f2[u[rt][i].v][j-t]<0)f2[u[rt][i].v][j-t]=dp(u[rt][i].v,j-t);
f[i][j]=min(f[i][j],f[i-1][t]+f2[u[rt][i].v][j-t]+u[rt][i].w);
}
if(f2[u[rt][i].v][0]<0)f2[u[rt][i].v][0]=dp(u[rt][i].v,0);
f[i][j]=min(f[i][j],f[i-1][j]+f2[u[rt][i].v][0]+2*u[rt][i].w);
}
}
//cout<<"title"<<rt<<' '<<num<<' '<<endl;
//for(i=0;i<l;i++){cout<<i<<':';for(j=0;j<=num;j++)cout<<f[i][j]<<' ';cout<<endl;}
//cout<<f[l-1][num]<<endl<<"-------"<<endl;
return f[l-1][num];
}
int main(){
load();
dfs(r);
memset(f2,-1,sizeof(f2));
cout<<dp(r,k)<<endl;
return 0;
}