比赛 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;
}