比赛 20161115 评测结果 AWWWAAWWWWWWWWWWWWWW
题目名称 树和机器人 最终得分 15
用户昵称 jmisnal 运行时间 0.094 s
代码语言 C++ 内存使用 12.37 MiB
提交时间 2016-11-15 11:34:16
显示代码纯文本
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define ll long long
using namespace std;
int read()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x;
}
struct data{
	int to,next,v;
}e[120000];
int head[50005],cnt;
void insert(int u,int v,int w){e[++cnt].to=v;e[cnt].next=head[u];e[cnt].v=w;head[u]=cnt;}
int n,root,k;
ll f[50005][25];
ll S[50005];
vector<int>sons[50005];
void dfs(int now,int fa)
{
	for(int i=head[now];i;i=e[i].next)
	{
		int to=e[i].to;
		if(to==fa)continue;
		sons[now].push_back( e[i].v );
		dfs(to,now);
	}
	sort(sons[now].begin(),sons[now].end());
	for(int i=0;i<sons[now].size();i++)
	{
		S[i+1]=S[i]+sons[now][i];
	}
}
void dp(int now,int fa)
{
	cout<<now<<endl;
	for(int i=head[now];i;i=e[i].next)
	{
		int to=e[i].to;
		if(to==fa)continue;
		dp(to,now);
		for(int j=k;j>=0;j--)
		{
			f[now][j]=5000000000;
			for(int p=0;p<=j;p++)
				f[now][j]=min(f[now][j],f[now][p]+f[to][j-p]);
		}
	}
	cout<<'*'<<now<<' '<<' '<<f[now][k]<<' '<<S[sons[now].size()]<<endl;
	for(int j=k;j>=1;j-- )
	{
	//	cout<<j<<' ';
		if(sons[now].size()>=j)
			f[now][j]+= S[ sons[now].size()-j  ]*2+S[sons[now].size()]-S[j];
		else f[now][j]+=S[sons[now].size()];
	}
	cout<<'*'<<now<<' '<<' '<<f[now][k]<<endl;
}
int main()
{
//	freopen("abcd.in","r",stdin);
	freopen("trobot.in","r",stdin);
	freopen("trobot.out","w",stdout);
	n=read();root=read();k=read();
	ll sb=0;
	for(int i=1;i<n;i++)
	{
		int x=read(),y=read(),z=read();
		insert(x,y,z);
		insert(y,x,z);
		sb+=z;
	}	
	printf("%lld\n",sb);return 0;
	dfs( root,0 );
//	for(int i=0;i<sons[1].size();i++)
//		cout<<sons[1][i]<<" ";
	
	dp(root,0);
//	cout<<sonsv[1][1]<<" "<<sonsv[1][2]<<' '<<sonsv[1][3]<<' '<<sonsv[1][4]<<endl;
	printf("%lld\n",f[root][k]);
	return 0;
}