#include<stdio.h>
#include<math.h>
#include<string.h>
#define pb push_back
#define fi first
#define se second
typedef long long ll;
int n,m,k,u,v,w;
int num[50010];
ll dp[50010][105],tmp[105];
int ok[50010];
int head[50010],cnt;
int min(int x,int y)
{
return x>y?y:x;
}
ll MIN(ll x,ll y)
{
return x>y?y:x;
}
struct edge
{
int v,nex,w;
}e[100010];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nex=head[u];
head[u]=cnt;
}
void dfs(int u,int fa)
{
dp[u][0]=0;
if(ok[u])
{
num[u]=1;
dp[u][1]=0;
}
int i,p,q;
for(i=head[u];i;i=e[i].nex)
{
int v=e[i].v,w=e[i].w;
if(v==fa)continue;
dfs(v,u);
int sum=min(k,num[u]+num[v]),mn=min(k,num[u]);
for(p=0;p<=sum;++p)
tmp[p]=dp[u][p];
for(p=0;p<=mn;++p)//其余子树p个
for(q=0;p+q<=sum;++q)//当前子树q个
tmp[p+q]=MIN(tmp[p+q],dp[u][p]+dp[v][q]+1ll*q*(k-q)*w);
for(p=0;p<=sum;++p)
dp[u][p]=MIN(dp[u][p],tmp[p]);
num[u]+=num[v];
}
}
int main()
{
int i;
scanf("%d%d%d",&n,&m,&k);
memset(dp,0x3f,sizeof dp);
for(i=1;i<=m;++i)
{
scanf("%d",&v);
ok[v]=1;
}
for(i=2;i<=n;++i)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs(1,-1);
printf("%lld\n",dp[1][k]);
return 0;
}
/*
5 3 2
1 3 5
1 2 4
1 3 5
1 4 3
4 5 1
*/
CCF 201909-5 城市规划(C语言)
最新推荐文章于 2021-08-23 06:01:54 发布