http://acm.hdu.edu.cn/showproblem.php?pid=4313
一遍dfs 注意值的传递就可以了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<cmath>
#define LL long long
using namespace std;
const int N=100010;
const int M=1000000000;
struct node
{
LL sum;
struct tt *next;
}mem[N];
bool machine[N];
struct tt
{
int j;
int k;
struct tt *next;
};
LL Mmax(LL a,LL b)
{
if(a>b)
return a;
return b;
}
LL Mmin(LL a,LL b)
{
if(a<b)
return a;
return b;
}
void build(int i,int j,int k)
{
struct tt *t=new tt;
t->j=j;
t->k=k;
t->next=mem[i].next;
mem[i].next=t;
}
void Dele(int n)
{
for(int i=0;i<n;++i)
mem[i].next=NULL;
}
LL dfs(int pre,int x)
{
//cout<<x<<endl;
struct tt *t=mem[x].next;
bool flag=false;
mem[x].sum=0;
LL sumtemp=0;
LL Msum=0;
while(t!=NULL)
{
if(t->j==pre)
{t=t->next;continue;}
flag=true;
LL a;
a=dfs(x,t->j);
a=Mmin(a,(LL)(t->k));
sumtemp+=a;
Msum=Mmax(Msum,a);
mem[x].sum+=mem[t->j].sum;
t=t->next;
}
if(flag==false)
{//cout<<x<<" "<<mem[x].sum<<endl;
if(machine[x]==true)
return M;
return 0;
}
mem[x].sum+=sumtemp;
if(machine[x]==true)
{//cout<<x<<" "<<mem[x].sum<<endl;
return M;
}else
{
mem[x].sum-=Msum;
return Msum;
}
}
int main()
{
//freopen("data.txt","r",stdin);
int T;
scanf("%d",&T);
int n,m;
while(T--)
{
scanf("%d %d",&n,&m);
for(int i=1;i<n;++i)
{
int x,y,k;
scanf("%d %d %d",&x,&y,&k);
build(x,y,k);
build(y,x,k);
}
memset(machine,false,sizeof(machine));
while(m--)
{
int x;
scanf("%d",&x);
machine[x]=true;
}
dfs(-1,0);
cout<<mem[0].sum<<endl;
Dele(n);
}
return 0;
}