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