http://acm.hnu.cn/online/?action=problem&type=show&id=13309
利用数组node,head建树
深度遍历两次:
1.找出要走到的点
2.计算总代价
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <set>
#define MAXN 100000+5
#define MAX 200000
struct Node{
int to,val,next;
}node[MAX];
bool vis[MAXN];
int dis[MAXN];
int head[MAXN];
int ans;
void dfs(int u,int v){//搜索要走路线
for(int i=head[u];i!=-1;i=node[i].next){
int t=node[i].to;
if(t==v) continue;
dfs(t,u);
if(vis[t]) vis[u]=1;
}//for
}//dfs
void _dfs(int u,int v){//计算总代价
for(int i=head[u];i!=-1;i=node[i].next){
int t=node[i].to;
if(t==v) continue;
dis[t]=dis[u]+node[i].val;
if(vis[t]) ans+=node[i].val;
_dfs(t,u);
}
}//_dfs
int main(){
int n,f;
while(scanf("%d%d",&n,&f)!=EOF){
int i;
int u,v,w;
int tot=0;
//初始化
ans=0;
dis[1]=0;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
for(i=0;i<n-1;i++){
scanf("%d%d%d",&u,&v,&w);
//建树
node[tot].to=v; node[tot].val=w; node[tot].next=head[u];head[u]=tot++;
node[tot].to=u; node[tot].val=w; node[tot].next=head[v];head[v]=tot++;
}
for(i=0;i<f;i++){
int r;scanf("%d",&r);
vis[r]=1;
}//for
dfs(1,-1);
_dfs(1,-1);
int ma=dis[1];
for(i=1;i<=n;i++)
if(vis[i]) ma=ma>dis[i]?ma:dis[i];
printf("%d\n",ans-ma);
}
return 0;
}