#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
typedef __int64 lld;
const lld INF=(lld)10000000*1000000;
const int maxn=10005;
lld dp[maxn][15];
vector<pair<int,int> > edge[maxn];
int N,S,K;
bool vis[maxn];
lld Min(lld a,lld b){
if(a<b)return a;
return b;
}
void dfs(int u,int K){
int i,j,k;
vis[u]=true;
int sz=edge[u].size();
for(i=0;i<sz;i++){
int v=edge[u][i].first;
int c=edge[u][i].second;
if(vis[v])continue;
dfs(v,K);
for(j=K;j>=0;j--){
dp[u][j]+=dp[v][0]+c*2;
for(k=1;k<=j;k++){
dp[u][j]=Min(dp[u][j],dp[u][j-k]+dp[v][k]+c*k);
}
}
}
}
int main(){
int i,j;
int u,v,c;
while(scanf("%d%d%d",&N,&S,&K)!=EOF){
for(i=0;i<=N;i++)
edge[i].clear();
for(i=1;i<N;i++){
scanf("%d%d%d",&u,&v,&c);
edge[u].push_back(make_pair(v,c) );
edge[v].push_back(make_pair(u,c) );
}
memset(dp,0,sizeof(dp));
memset(vis,false,sizeof(vis));
dfs(S,K);
lld ans=dp[S][0];
for(i=1;i<=K;i++){
if(ans>dp[S][i])
ans=dp[S][i];
}
printf("%I64d\n",ans);
}
return 0;
}
Find Metal Mineral HDU
最新推荐文章于 2022-02-25 21:57:21 发布